C语言-----动态内存管理(1)

时间:2024-04-17 16:50:10

1.引入

我们之前已经学习了几种开辟内存空间的方式:
(1)int a=10;开辟4个字节大小的空间

(2)int arr[10]={0}定义数组开辟了一串连续的空间

2.malloc和free

(1)malloc开辟内存空间可能会失败,因此需要检查是否为空指针

(2)malloc返回void*类型,指针p是int*类型,因此需要强制类型转换

(3)malloc申请到空间以后,直接返回这块空间的起始地址,不会初始化空间的内容

(4)malloc申请的空间,只有程序退出的时候才会还给操作系统,当程序不退出的时候,动态申请的内存,需要使用free释放空间

(5)free释放空间之后,需要及时的置为空指针

(6)free,malloc的声明都放在stdlib.h的头文件里面的;

3.calloc

(1)这个函数和malloc用法基本相同,不同的地方就是参数不同,这个有2个参数,第一个是个数(徐要开辟空间的个数),第二个就是单个空间的大小

(2)这个函数不像malloc函数,返回空间起始地址,这个会初始化全部为0;

4.realloc

(1)realloc也有2个参数,它可以随时改变我们申请的内存空间的大小,因为有的时候我们申请的

内存空间可能会不够

(2)这里是原来申请40字节的空间,后来改成了80字节;

这里会有2种情况,

-----1.与之相邻的连续空间足够可以容纳80字节

-----2.与之相邻的连续空间不够,这个时候会重新开辟80字节空间,把原来的40字节空间里面的数

据复制过去,然后是释放掉原来的空间(这个释放不需要我们自己进行)

(3)如果是重新开辟80字节的空间,就有可能开辟失败,这个时候如果我们直接给p,就有可能

原来的空间不见了,新的空间也没有,造成内存的泄露

(4)我们先给ptr指针,如果这个不是NULL,我们再传给p,就可以避免上面的内存泄漏问题了

(5)如果realloc里面的第一个参数是空指针,他的功能就和malloc完全相同