在讲四大函数之前我们先来讲讲为什么要有动态内存分配
目前我们掌握的动态内存开辟方式有:
上述的开辟空间方式有两个特点:
空间开辟大小是固定的 ;
数组在声明的时候,必须指定数组的长度,数组空间一旦确定了大小不能调整。
但是对于空间的需求,我们有时发现上面的方式是不够用的,所以,C语言引入了动态内存开辟,让程序员自己可以申请和释放空间,这个时候就比较灵活了。
我们接下来就先讲malloc和free这两个函数
malloc
首先,malloc是C语言提供的一个动态内存开辟的函数
这个函数的功能是向内存申请一块连续可用的空间,并返回指向这片空间的指针。
可能情况:
1.如果开辟成功,则返回一个开辟好空间的指针。
2如果开辟失败,则返回一个空指针(NULL) ,因此malloc的返回值一定要做一个检查。
3.返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
4.如果参数size为0,malloc行为的标准是未定义的,取决于编译器。
接下来是free函数
C语言提供了free这个函数,专门用来动态内存的释放和回收,函数原型如下:
情况:
1.如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的。
2.如果参数ptr 是NULL空指针,则函数什么事都不做。
注意:1.malloc和free都声明在<stdlib.h>这个头文件中。
2.开辟的动态内存空间要用free释放掉,并给这个指针赋值为空(NULL)。
在说完上述的两个函数之后我们来了解接下来的两个函数calloc和realloc
calloc
calloc的功能与malloc比较类似,calloc也用来开辟动态内存空间
1.函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0.
2.与函数malloc的区别只在于会把每个字节都初始化为0.
所以如果我们对内存开辟的要求要初始化,那么我们可以很方便的使用calloc函数来实现。
那么,我们来讲最后一个函数realloc
realloc函数的出现让动态内存管理更加灵活。
有的时候我们发现在过去我们申请的空间太小了,有的时候又感觉太大了,那为了合理的使用内存,我们一定会对内存的大小做灵活的调整,而realloc函数就可以做到这一点。
ptr是要调整的内存地址;
size调整之后新的大小;
返回值为内存调整之后的内存起始位置;
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
realloc在调整内存空间的时候有两种情况:
1.原有空间有足够大的空间会返回原空间的地址;
2.原有空间没有足够大的空间会返回新的地址。
当然也存在访问失败的情况,这个时候就需要检查它的返回值。