c内存操作函数干到发抖的干货

文章目录


memcpy

作用:

拷贝内存空间,

返回值:

指向dest的指针。

void* memcpy(void* dest,void* src,size_t N);

注释:

其中dest为目标内存区,src为源内存区,N表示拷贝的字节数。

注意:

1.未考虑内存重叠情况。
2.灵活性高,因为memcpy函数并不关心被复制的数据类型,也就是可以面向任何数据类型进行拷贝。
3.dest指针要分配足够的空间,空间不足会出现段错误。
4.如果dest所指内存与src所指内存有重叠,会出现行为未定义的错误。

memmove

作用:

拷贝内存空间。

返回值:

指向dest的指针。

void* memmove(void* dest,void* src,size_t N);

注释:

dest为目标内存区,src为源内存区,N为拷贝字节数。

注意:

1.相比memcpy函数,当dest与src所指向的空间有重叠时,memmove仍然可以处理,执行效率稍差memcpy一点点。

malloc

作用:

动态内存分配。

返回值:

分配成功返回分配后内存的首地址,不成功则返回NULL;

void* malloc(size_t size);

注释:

size为分配内存块的大小。

注意:

1.malloc函数是在堆上进行操作的。
2.malloc函数一次只能申请一块内存区。
3.malloc函数不会对分配的内存进行初始化。

calloc

作用:

动态内存分配。

返回值:

与malloc相同。

void* calloc(int num,size_t size);

注释:

num为分配内存块的个数,size为分配内存块的大小。

注意:

1.对比malloc函数,calloc函数一次可以开辟多个内存区。
2.对比malloc函数,calloc函数会将分配的内存进行初始化为0的操作。

realloc

作用:

动态内存空间大小调整。

返回值:

调整成功返回调整后内存起始地址,失败返回NULL。

void* realloc(void* ptr,size_t size);

注释:

ptr为malloc或calloc等函数进行过动态内存分配的指针,size为重新分配空间的字节数,如果是0且ptr指向只有一个已存在的内存块,ptr所指向的内存会被释放并返回一个空指针。

注意:

1.原始内存中的数据保持不变。

free

作用

动态内存释放。

返回值

:无。

void free(void* ptr);

注释

ptr为malloc或calloc等内存分配函数所分配过动态内存空间的指针。

注意:

1.malloc和calloc与free是对应的关系,若动态分配的内存空间没有free释放掉,会造成内存泄漏。

memset

作用:

初始化指定内存空间。

返回值:

指向buffer的指针。

void* memset(void* buffer,int c,size_t N);

注释:

buffer为指定的内存空间,c为初始化内容,N为初始化的字节数。

注意:

1.memset是按字节为单位,对buffer所指的内存赋值。

错误操作:
int a[5];
memset(a,3,5*sizeof(int));//这里的情况下a里每个int元素被初始化成为。
00000011 00000011 00000011 00000011
正确操作:
memset(a,0,5*sizeof(int));//此时全部初始化为0;
上一篇:linux asan和objdump排查内存泄露以及coredump


下一篇:Linux 库打桩机制