欢迎光临
我们一直在努力

【C语言】动态内存管理详解(malloc/calloc/realloc/free)

前言:

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

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

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

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

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

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

  • 容易造成内存浪费或内存不足

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

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

    需要头文件:
    在这里插入图片描述

  • malloc —— 申请动态内存
    在这里插入图片描述
    • 功能:向堆区申请连续的一块内存

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

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

    • 使用前必须判空检查

    示例:
    在这里插入图片描述
    2. calloc —— 申请并初始化为0
    在这里插入图片描述

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

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

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

    示例:
    在这里插入图片描述
    3. realloc —— 调整内存大小(扩容/缩容)
    在这里插入图片描述

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

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

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

    正确写法:
    在这里插入图片描述
    4. free —— 释放动态内存
    在这里插入图片描述

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

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

    • 不释放会造成内存泄漏

    标准写法:
    在这里插入图片描述
    三、完整示例代码
    在这里插入图片描述
    四、动态内存常见错误

  • 忘记 free → 内存泄漏

  • free 后不置空 → 出现野指针

  • 重复 free → 程序崩溃

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

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

  • free 栈区指针 → 程序崩溃

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    六、总结

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

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

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

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

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

    赞(0)
    未经允许不得转载:171主机测评 » 【C语言】动态内存管理详解(malloc/calloc/realloc/free)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址