我们目前只知道创建变量和创建数组去开辟空间。
但是我们今天来学4个函数,分别是:malloc、free、calloc、realloc.
1.malloc、free
这个就是它的格式:
malloc开辟的空间实在堆区上的。
如果我们的malloc函数开辟空间失败了,那么我们返回的就是NULL
那么我们开辟了内存之后是怎么回收的呢?
1、程序结束的时候,会自动回收。
2、手动回收。
手动回收利用free()
但是,当我们释放了我们创建的动态内存块之后,假设我们用一个指针变量来接收这个动态内存了:
大家可以看到P仍然记录了我们释放的内存块的地址。这是很危险的。
所以我们把P置成空指针。
是用了置为空指针之后,可以看到P指针,存的地址才会变。
在使用malloc的时候,最好和free成对使用。
free释放的空间必须是动态开辟的,否则是没有作用的。如果free的内容是空指针,那么free什么都不做。
free必须要释放全部的内存块,不能只释放开辟的内存块的一部分,free(“起始位置地址”)。
不要对同一块空间多次释放,一块动态开辟的内存块只能释放一次。
不能忘记释放,会出现内存泄漏。浪费内存。
malloc申请的空间里面,默认放的是随机值.
2.calloc
calloc会开辟一块空间, 还会初始化成0。开辟失败也会返回空指针。3.realloc
当我们开的动态内存不够用的时候,我们就用realloc增扩空间。realloc只会扩增,不会初始化扩增的空间。扩增失败也会返回空指针。
realloc扩空间的时候,如果后面的空间不够大,会重新开辟一块空间 ,还会把原来内存的数据拿到新的空间里。如果空间够大,就在后面直接开空间。
realloc的返回值可能是新地址,所以我们最好单独创建一个指针来接收返回值。
如果realloc的第一个参数给的是空指针,那么就会帮你重新开一个空间。和calloc的格式一样,但功能和malloc的一样