您的位置:首页 > 其它

动态内存管理(malloc、 free、 calloc、 realloc)

2017-10-10 21:00 316 查看
1.malloc
声明:void *malloc(size_t size);

功能:向系统申请分配指定size个大小的字节空间。返回值为void *
使用示例:int *p = (int *)malloc(10 * sizeof(int));
注意:在使用这块内存前,必须判断malloc是否申请内存成功(if (p == NULL)),如果内存满了,就会申请失败。

★free(p) 当你不使用这块空间时,切记切记把它释放掉。malloc和free必须成对使用。释放完空间后也要把p指向空(p == NULL),
free(p)实际上是斩断了p和那块内存的联系,但p仍存这这块空间的地址,还是可以通过P来对这块内存进行非法操作,这是很可怕的一件事。

**********************************************************************************************************************************************************************

2.calloc
声明:void *calloc(size_t n, size_t size)
功能:在内存的动态储存区中分配n个长度为size的连续空间,并初始化为0,返回一个指向起始地址的指针,分配失败返回NULL。
使用示例:int *p = (int *)calloc(10, sizeof(int));

★和malloc一样,使用前要判空if (p == NULL),用完后释放、指空(free(p); p ==NULL)。
★因为calloc会初始化,所以效率比malloc低。

**********************************************************************************************************************************************************************

3.realloc(谨慎使用)
声明:void *realloc(void *men_address, unsiged int newsize);
指针名 = (数据类型 *)realloc(要改变大小的内存的指针名, 新的大小)
使用示例:我先申请了int *p = (int *)malloc(10*sizeof(int)) 10个int大小的空间,但后来我觉着这个空间有点小了,想把它扩大到20个int大小,
我就可以用 p = (int *)realloc(p, 20*sizeof(int)),把它扩到20个int大小。

realloc使用时的三种情况:
(1)如果当前内存块后有足够的连续空间,那realloc就会把它扩大到指定大小,并返回原地址。
(2)如果当前内存块后没有足够大的空间,那realloc就会找一个足够大的地方,重新给你分配一个指定大小的空间,并把原数据从头到尾拷贝到新分配的内存区域,同时返回新分配的内存区域的地址,且把原空间释放掉。
(3)如果realloc重新分配的newsize比原来的oldsize还要小时,那他就会舍弃后面的数据数据,然后返回原空间的地址。
(4)如果重新分配的大小newsize为0,那么此处realloc的作用相当于free()。

★传给realloc()的指针可以为空,那相当于malloc()。

★realloc的操作的空间必须是malloc(),calloc()或realloc()操作过的空间。

★realloc失败时返回NULL,但原空间不会改变,不会被free了
★在使用realloc时要定义一个空指针,int *ptr = NULL; ptr = realloc(p,20*sizeof(int)); if (ptr != NULL) p = ptr;
为啥要这么写呢?这是为了保护p。如果realloc无论如何都找不到一个20*sizeof(int)大小的空间,那他就会返回NULL,如果直接用p接收了,那p原来指向的空间也没了啊,多蛋疼啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: