☰
【C语言】动态内存管理详解(malloc/calloc/realloc/free)
2026/10/13 2:23:43 网站建设 项目流程

前言:

在C语言里,我们平时定义数组时,大小必须在编译时就确定,运行期间无法修改。这就会导致空间不够用或者空间浪费。

动态内存就是为了解决这个问题:允许程序在运行时自己申请、自己释放、自己调整大小,更加灵活高效。

本文带你用最简单的方式,吃透动态内存的核心知识点。

一、为什么需要动态内存?

  1. 普通数组大小固定,不能动态改变

  2. 无法根据实际数据多少灵活分配空间

  3. 容易造成内存浪费或内存不足

  4. 动态内存开辟在堆区,由程序员手动管理

二、动态内存的4个核心函数

需要头文件:

  1. malloc —— 申请动态内存
  • 功能:向堆区申请连续的一块内存

  • 不会初始化,内存里是随机值

  • 成功返回地址,失败返回 NULL

  • 使用前必须判空检查

示例:

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

  • 功能:申请内存,并全部自动初始化为0

  • 参数:元素个数 + 单个元素大小

  • 适合需要清零初始化的场景

示例:

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

  • 功能:对已经申请的动态内存重新调整大小

  • 扩容可能在原地,也可能重新找一块新空间

  • 不能直接用原指针接收返回值,防止扩容失败丢失原空间

正确写法:

4. free —— 释放动态内存

  • 功能:释放动态申请的内存,还给操作系统

  • free 不会把指针置空,必须手动置空

  • 不释放会造成内存泄漏

标准写法:

三、完整示例代码

四、动态内存常见错误

  1. 忘记 free → 内存泄漏

  2. free 后不置空 → 出现野指针

  3. 重复 free → 程序崩溃

  4. 直接用原指针接收 realloc → 内存丢失

  5. 越界访问动态内存 → 程序崩溃

  6. free 栈区指针 → 程序崩溃

五、动态内存 高频面试题(必背)

  1. malloc 和 calloc 有什么区别?
  • malloc 申请的内存不会初始化,内容是随机值

  • calloc 会把内存自动初始化为 0

  • 参数不同:malloc 传总字节数,calloc 传元素个数 + 单个大小

  1. 为什么 free 之后要把指针置为 NULL?
  • free 只是释放空间,不会修改指针的值

  • 不置空,指针会变成野指针,再次使用会导致程序崩溃

  • 置空后,即使不小心再次 free 也不会出错

  1. realloc 扩容失败会发生什么?
  • 失败返回 NULL

  • 原内存不会被释放,数据依然保留

  • 所以不能直接用原指针接收返回值,否则会导致原地址丢失

  1. 什么是内存泄漏?有什么危害?
  • 动态内存申请后没有 free,一直占用堆区

  • 短期运行看不出问题,长期运行会占用越来越多内存,最终导致程序卡顿甚至崩溃

  1. 动态内存和普通数组的区别?
  • 数组在栈区,大小固定;动态内存在堆区,大小可调整

  • 数组由系统自动释放,动态内存必须手动 free

六、总结

  • 动态内存可以灵活申请、释放、扩容,解决数组固定大小的问题

  • 核心函数:malloc、calloc、realloc、free

  • 申请后必须判空,用完必须释放,释放后必须置空

  • 是C语言进阶、面试、考试的高频考点

创作不易,如果文章对你有帮助,欢迎 点赞、收藏、关注!
后续会持续更新 C 语言进阶、数据结构、算法相关干货,我们一起进步~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询