本篇博客将讲解以下知识:
1、calloc和realloc
2、常见的动态内存错误
1、calloc和realloc
(1)calloc
C语言中还提供了一个函数叫calloc,calloc也用来动态内存分配
calloc函数原型:
void* calloc(size_t num, size_t size)
1))函数的返回值是申请的空间的起始地址
2))函数的功能是把num个大小为size的元素开辟一块空间并且把空间的每个字节初识化为0;
3))与函数malloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0(零)
示例:
所以,如果我们对申请的内存空间的内容要求初识化,那么可以很方便的使用calloc函数来完成任务。
(2)realloc函数
注意:使用realloc函数时,要包含头文件:stdlib.h
1))realloc函数的出现让动态内存管理更加灵活
2))有时我们会发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存,我们一定会对内存的大小做灵活的调整。
realloc函数的原型:
void* realloc(void * ptr, size_t size)
1))ptr是要调整的内存地址
2))size为调整之后新大小,单位是字节。
3))返回值为调整之后的内存起始地址。
4))这个函数调整原内存空间的基础上,还会将原来内存中的数据移动到新的空间。
5))realloc在调整空间时存在两种情况
情况一:原有空间之后有足够大的空间
情况二:原有空间之后没有足够大的空间。
情况三:返回的是NULL
情况二:原有空间之后没有足够大的空间。
1))在堆区的内存中找一个新的空间并且符合新的大小要求。
2))会把原来空间的数据拷贝一份到新的空间。
3))释放旧的空间
4))返回新的内存空间的起始地址。
情况一:原有空间之后有足够大的空间
要扩展内存就直接在原有内存之后直接追加空间,原来空间的数据不发生变化,返回的是旧的空间的地址。
由于上述两种情况,realloc函数的使用就要注意一下。
示例:
realloc函数的特殊用途:
realloc(NULL,20);//完全等价于malloc(20);
2、常见的动态内存错误
(1)对NULL指针的解引用操作
代码:
INT_MAX是一个非常大的数字:
该题存在的问题就是:不能确定p的值是否是NULL,如果是NULL的话,则不能对指针变量解引用赋值。
解决方法:
(2)动态内存忘记释放(内存泄漏)
内存泄漏:申请了动态内存,但不释放该动态内存
示例:
忘记释放不再使用的动态开辟的内存会造成内存泄漏。
切记:动态开辟的空间一定要释放,并且正确释放,即malloc和free成对出现。
其实,malloc/calloc/realloc申请的动态内存,如果不再使用,就可以使用free释放。