前言:
在C语言里,我们平时定义数组时,大小必须在编译时就确定,运行期间无法修改。这就会导致空间不够用或者空间浪费。
动态内存就是为了解决这个问题:允许程序在运行时自己申请、自己释放、自己调整大小,更加灵活高效。
本文带你用最简单的方式,吃透动态内存的核心知识点。
一、为什么需要动态内存?
普通数组大小固定,不能动态改变
无法根据实际数据多少灵活分配空间
容易造成内存浪费或内存不足
动态内存开辟在堆区,由程序员手动管理
二、动态内存的4个核心函数
需要头文件:


-
功能:向堆区申请连续的一块内存
-
不会初始化,内存里是随机值
-
成功返回地址,失败返回 NULL
-
使用前必须判空检查
示例:

2. calloc —— 申请并初始化为0

-
功能:申请内存,并全部自动初始化为0
-
参数:元素个数 + 单个元素大小
-
适合需要清零初始化的场景
示例:

3. realloc —— 调整内存大小(扩容/缩容)

-
功能:对已经申请的动态内存重新调整大小
-
扩容可能在原地,也可能重新找一块新空间
-
不能直接用原指针接收返回值,防止扩容失败丢失原空间
正确写法:

4. free —— 释放动态内存

-
功能:释放动态申请的内存,还给操作系统
-
free 不会把指针置空,必须手动置空
-
不释放会造成内存泄漏
标准写法:

三、完整示例代码

四、动态内存常见错误
忘记 free → 内存泄漏
free 后不置空 → 出现野指针
重复 free → 程序崩溃
直接用原指针接收 realloc → 内存丢失
越界访问动态内存 → 程序崩溃
free 栈区指针 → 程序崩溃
五、动态内存 高频面试题(必背)
-
malloc 申请的内存不会初始化,内容是随机值
-
calloc 会把内存自动初始化为 0
-
参数不同:malloc 传总字节数,calloc 传元素个数 + 单个大小
-
free 只是释放空间,不会修改指针的值
-
不置空,指针会变成野指针,再次使用会导致程序崩溃
-
置空后,即使不小心再次 free 也不会出错
-
失败返回 NULL
-
原内存不会被释放,数据依然保留
-
所以不能直接用原指针接收返回值,否则会导致原地址丢失
-
动态内存申请后没有 free,一直占用堆区
-
短期运行看不出问题,长期运行会占用越来越多内存,最终导致程序卡顿甚至崩溃
-
数组在栈区,大小固定;动态内存在堆区,大小可调整
-
数组由系统自动释放,动态内存必须手动 free
六、总结
-
动态内存可以灵活申请、释放、扩容,解决数组固定大小的问题
-
核心函数:malloc、calloc、realloc、free
-
申请后必须判空,用完必须释放,释放后必须置空
-
是C语言进阶、面试、考试的高频考点
创作不易,如果文章对你有帮助,欢迎 点赞、收藏、关注!
后续会持续更新 C 语言进阶、数据结构、算法相关干货,我们一起进步~





