背景:小白今天机缘巧合碰到了内存处理函数:memcpy,memmove,犹记得看到他两的那一刹那,你不认识我,我认识你的尴尬局面,现翻了翻网,总结了一下
常见的内存操作函数:
1. malloc / calloc
功能:动态内存分配函数
头文件:#include < stdlib.h >
函数原型:(void *)malloc ( size_t size ); // void *) 代表的是指向不确定类型的指针
(void * )calloc(int num, size_t size)//num为分配内存块的个数,size为分配内存块的大小
返回值:分配成功返回分配内存的首地址,失败返回NULL
区别:a. malloc一次只申请一个内存区,calloc一次可以申请多个内存区(calloc中有个内存块的参数num)
b. malloc不会对分配的内存初始化,calloc会初始化为0
注:malloc和calloc是C里面的用法,综合效果来说,不如C++中new,new不用考虑那么多,直接用即可。
2. free
功能:动态内存释放
头文件:#include < stdlib.h >
函数原型:void free ( ( void * ) ptr)//ptr为malloc或者calloc返回的分配内存的首地址,即内存指针
返回值:无
注:a. free是C中的释放内存的函数,C++中用的是delete,用法:一: delete ptr ;( 释放ptr指针相对应的内存 ) 二: delete [ ] ptr ;( ptr为指向数组的指针 )
b. malloc( calloc )和 free 是一一对应的,若有malloc或者calloc,但是没有free,容易造成内存泄露,同理,new 和 delete 也是一一对应的。
3. memcpy
头文件:#include < string.h >
函数原型:( void * )memcpy ( void * dest,const void * src,size_t n ) //dest为目标内存区,src为源内存区,n为需要拷贝的字节数
函数功能:拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束' \0 '而结束
返回值:返回指向dest的指针 //网上有说返回的是src的指针,这个有待小白考证!
局限性:为考虑内存重叠情况//dest <= src-count 或dest >= src+count时,会产生覆盖问题,即源数据会被更改
函数实现:
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;
}
头文件:#include < string.h >
函数原型:(void *)memmove(void * dest,void * src,size_t n)//dest为目标内存区,src为源内存区,n为需要拷贝的字节数
函数功能:将src所对应的内存前n的字节的内容移动到dest对应的内存区
返回值:指向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;
}
6. 名称: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
7. 名称: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。