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完全相同