前言
我们已经学会了类似于数组那样的申请一块固定的空间来使用,但是我们有时候需要的空间大小是在程序运行的时候才知道,这时候我们就需要动态内存管理的知识了。
下面我们一起来了解动态内存管理的知识吧......
一些小知识:
内存可以简单分为栈区,堆区,和静态区(实际要复杂很多),然后在栈区我们存放的是局部变量还有函数的形式参数,在静态区我们存放的是静态变量和全局变量,而与我们今天要介绍的动态内存管理相关的区域就是堆区了,我们使用malloc函数,calloc函数,realloc函数,以及free函数所动态管理的内存就是堆区的内存。
1.malloc函数和free函数
(1)malloc函数
malloc函数的形式和具体内容截取一部分如下:
需要更多了解可以去cpuls观看:malloc - C++ Reference
根据上面的截图不难发现,melloc函数会为你开辟一块size大小的内存供你使用,并返回这块内存的起始地址给你。
但是有成功的开辟当然也会有失败的开辟:
对于这个函数,如果成功开辟确实会返回起始空间的地址,但是如果失败的话对应的就会给你返回空指针。所以在使用时当时要检验一下是否是空指针。
malloc函数申请到的空间,没有初始化然后直接返回起始地址。
(2)malloc函数的使用
以下就是这个函数的简单使用以及对于空指针的检验。
(3)free函数
对于上述代码,我们对这块空间使用完之后,如果程序结束,这块空间自然会回收回去,但是如果程序长时间不结束的话,那么我们如果不主动归还就会一直占用这块空间。free函数就是主动归还这块空间所使用的函数。
当然free函数的使用十分简单,只需要传入想要释放的空间的地址就可以了。
free函数虽然会释放这块空间但是并不会将p指针变成空指针,所以还要自己来改变。
如果参数ptr指向的空间不是动态开辟时,则free函数的行为是未定义的。
(4)具体代码
melloc函数使用 · zyzyzy_mhmhmh/c语言学习 - Gitee.com
2.calloc函数
(1)函数内容
以下是对参数的解释:
calloc函数申请好空间后,会把空间初始化为0然后再返回起始地址。
(2)函数使用
函数的使用方法和上面的malloc类似,基本没什么区别。
4.realloc函数
(1)函数内容
函数的详细内容参考:realloc - C++ Reference;
以下截取主要部分:
由上述图中可以知道,realloc函数可以对开辟的空间进行调整,改变其大小,当然它也可以自己开辟空间。
以下是参数的含义:
用realloc函数可以对使用melloc函数calloc函数和realloc函数开辟的空间大小进行改变。
当我们给realloc传递的指针是空指针时,那么就相当于melloc函数的作用。
(3)realloc函数的作用情况
对于realloc函数的作用情况有两种:
<1>已有的动态内存后面内存充足
如果后面空间充足,那么realloc函数会在已开辟的空间后面再追加你所需要扩充的空间大小,并返回这个空间的起始地址。
<2>已有的动态内存后面内存不足
如果后面空间不足,那么realloc函数会在其他地方找到一块符合大小的空间,,然后返回新的地址给你,当然原本存在的数据这个函数会拷贝过去,这样就不会出现数据丢失的情况了。而且在这种情况下,reallooc函数会帮你释放原本被拷贝的那块空间。
<3>注意
对于上面两条结论:我们可以知道在使用这个函数时候用于接收这个返回地址的地址我们可用一个新创建的指针参数来接受,这样可以有效的防止数据丢失。
(3)函数的使用
以上就是将5个字节的内存大小变成10个内存大小的举例
(4)具体代码
realloc函数的使用 · zyzyzy_mhmhmh/c语言学习 - Gitee.com
5.结尾
(1)以上几个函数使用时必须要对指针进行空指针的判断。
(2)同样都需要需要注意指针越界的问题。
(3)free不可以对非动态内存开辟的空间释放。
(4)free不能只释放一部分空间,也不能多次释放一个空间。
(5)动态内存开辟不能忘记释放。