动态内存管理(malloc/calloc/realloc/free) + 内存五大分区 完全笔记

📅 2026/7/9 6:16:39
动态内存管理(malloc/calloc/realloc/free) + 内存五大分区 完全笔记
说明:栈(Stack)和堆(Heap)在STM32上具体怎么配置大小、怎么排查栈溢出, "内存管理笔记"里已经详细讲过,这篇不重复展开,只在讲五大分区时简要提及、 串联起来,重点放在malloc家族函数的细节和.text/.rodata/.data/.bss这几个 "编译期就确定"的静态分区上。一、内存"五大分区"是什么,先澄清一个容易有分歧的地方一个C程序运行时,内存大致会被划分成几块,每块存放不同性质的内容: .text (代码段):编译后的机器指令 .rodata(只读数据段):字符串常量、const修饰的全局/静态数据 .data (已初始化数据段):初始值不为0的全局/静态变量 .bss (未初始化数据段):没有显式初始化、或者显式初始化为0的全局/静态变量 堆(Heap):malloc/calloc/realloc动态申请的内存 栈(Stack):函数调用、局部变量 ⚠️ "五大分区"具体怎么数,不同教材/资料说法不完全一致,这里如实说明: 常见的一种数法:代码段 + 数据段(.data) + BSS段 + 堆 + 栈,正好5个, 这种数法里.rodata经常被归并到代码段一起讲,不单独算一个分区 另一种数法:把.text/.rodata/.data/.bss算作4个"静态区"(编译时就确定大小和内容), 再加上堆和栈这两个"运行时动态区",一共6个部分 你如果在不同资料里看到"五大区"具体指代的东西对不上,属于正常现象, 不是谁错了,只是划分粒度不同,理解每一块具体存什么、怎么工作, 比纠结"到底该数成5个还是6个"更重要,这篇笔记把每一块都讲