内存操作函数(C)

来源:互联网 发布:淘宝虚拟物品退款技巧 编辑:程序博客网 时间:2024/05/17 22:08
1. 名称:malloc / calloc

功能:动态内存分配函数

头文件:#include <stdlib.h>

函数原型:void *malloc(size_t size);

void *calloc(int num, size_t size);

其中:num为分配内存块的个数,size为分配内存块的大小

返回值:分配成功返回分配内存块的首地址,失败返回NULL。

 

区别:(1)malloc一次只能申请一个内存区,calloc一次可以申请多个内存区;

(2)malloc不会对分配的内存初始化,calloc会初始化为0。

 

2. 名称:free

功能:动态内存释放函数

头文件:#include <stdlib.h>

函数原型:void free(void *ptr);

ptr为malloc或calloc等内存分配函数返回的内存指针。

返回值:无

 

注:malloc和calloc跟free是一一对应的关系,若动态分配内存没有free释放,容易造成内存泄露。

 

3. 名称:memcpy

功能:拷贝内存空间

头文件:#include <stdlib.h>

函数原型:void *memcpy(void *dest, void *src, size_t n);

其中:dest为目标内存区,src为源内存区,n为需要拷贝的字节数

返回值:指向dest的指针

局限性:未考虑内存重叠情况

 

函数实现:

void *memcpy(void *dest, void *src, size_t n)

{

    char *ret = char *dest;

    char *dest_t = ret;

    char *src_t = char *src;

 

    while(n--)

    {

        *dest_t++ = *src_t++;

    }

 

    return ret;

}

 

4. 名称:memmove

功能:拷贝(移动)内存空间

头文件:#include <stdlib.h>

函数原型:void *memmove(void *dest, void *src, size_t n);

其中:dest为目标内存区,src为源内存区,n为需要拷贝的字节数

返回值:指向dest的指针

相比memcpy:当dest与src重叠时,仍能正确处理,但是src内容会被改变

 

函数实现:

void *memmove(void *dest, void *src, size_t n)

{

    char *ret = char *dest;

    char *dest_t;

    char *src_t;

 

    if((unsigned char *dest <= unsigned char *src) || (unsigned char *dest >= unsigned char *src + n))

    {

        dest_t = char *dest;

        src_t = char *src;

       

        while(n--)

        {

            *dest_t++ = *src_t++;  //正向拷贝

        }

    }

    else

    {

        dest_t = char *dest + n - 1;

        src_t = char *src + n - 1;

       

        while(n--)

        {

            *dest_t-- = *src_t--;  //反向拷贝

        }

    }

 

    return ret;

}

 

5. 名称:memset

功能:初始化指定内存空间

头文件:#include <stdlib.h>

函数原型:void *memset(void *buffer, int c, size_t n);

其中:buffer为分配的内存,c为初始化你内容,n为初始化的字节数

返回值:指向buffer的指针

 

特别注意:memset是按字节为单位对buffer指向的内存赋值

例:int a[5];

        memset(a, 3, 5*sizeof(int));  //错误

        上述情况下每个int元素被初始化为:00000011 00000011 00000011 00000011

        memset(a, 0, 5*sizeof(int));  //正确,全部初始化为0

 

6. 名称:memcmp

功能:比较两个内存空间的字符

头文件:#include <stdlib.h>

函数原型:int memcmp(const void *buf1, const void *buf2, size_t n);

其中:n为要比较的字符数

返回值:当buf1 > buf2时,返回 > 0;当buf1 = buf2时,返回 = 0;当buf1 < buf2时,返回 < 0。