内存管理函数
宗旨:技术的学习是有限的,分享的精神是无限的。
一、 动态申请内存
1、 malloc/free
——动态分配内存和释放内存
(1)函数原型
void *malloc(size_tsize);
void free(void *str);
(2)函数参数
size:要分配的空间大小
(3)返回值
返回一个指向分配的连续存储域首地址的指针。失败返回NULL。
注意:调用free()释放内存就,不能再去访问被释放的内存空间,这块内存已经不属于原来的应用程序,此时是悬挂指针,为了安全起见,一般会再次将此指针变量置NULL;不能两次释放相同的指针;malloc与free配套使用。
array = (int *)malloc(10 * sizeof(int));
free(array);
array = NULL;<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
2、realloc
——更改已经配置的内存空间
(1) 函数原型
void *realloc(void *ptr, size_t size);
(2)函数参数
ptr:试图更改大小的原堆空间位置;
size:新的内存大小
(3)返回值
如果内存减少,malloc仅改变索引信息。
如果增加内存,如果当前内存段后面有足够的内存空间,则直接扩展内存空间,realloc将返回原指针;如果当前内存段后面的字节数不足,那么久使用堆中第一个能够满足这一要求的内存块,将目前的数据复制到新的位置并将原来的数据块释放掉,返回新的内存块地址;失败返回NULL,此时原来指针仍有效。
new_addr = (int*)realloc(old_addr, 100 * sizeof(int));
3、 calloc
——malloc的简单包装,把动态分配的内存初始化为0
void*calloc(size_t nmemb, size_t size)
{void *p;size_t total;total = nmemb * size;p = malloc(total);if(p != NULL){memset(p, '\0', total);}
}// ptr =(struct data *)calloc(count, sizeof(struct data));<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
4、 alloca
void *alloca(size_t size)
——在栈中分配大小为size的内存,成功返回指针,失败返回NULL
二、内存数据管理函数
1、 memcpy【memcpy(p2, p1, 10);】
——内存拷贝
(1) 函数原型
void *memcpy(void *dst, const void *src, size_t size);
(2) 函数参数
dst:复制后数据存储的首地址
src:数据源地址
size:复制大小
(3)返回值
执行成功返回目的地址。
memcpy()与strncpy():str参数是char *,memcpy参数是void *,memcpy更加强大,strncpy只能用于字符串操作,memcpy不止。void *——“空即是色”——强大。
bcopy()函数类似于memcpy()【bcopy多用于网络编程中】
void bcopy(const void *src, void *dest,size_t size);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
2、 memmove
——memcpy未考虑空间重叠,memmove考虑了。
(1)函数原型
void memmove(void *dst, const void *src, size_t size);
(2)函数参数
dst:复制后数据存储的首地址
src:数据源地址
size:复制大小
(3)返回值
执行成功返回目的地址。
memmove函数在复制之前,首先检查源地址和目的地址是否重叠,有,则进行处理再拷贝,没有则直接拷贝。
3、 memset【memset(buffer, 0, sizeof(buffer));】
——初始化指定内存
(1)函数原型
void *memset(void *s, int c, size_t size);
(2)函数参数
s:待初始化的内存首地址
c:初始化的值,一般写0
size:要初始化的内存大小
(3)返回值
执行成功返回s的首地址
bzero与memset:bzero效率高一些。