337 内存管理深入:堆栈的区别
你可能已经知道C语言有malloc和free来管理内存,但你知道内存其实分很多种吗?你的变量存在哪?函数调用时发生了什么?为什么有的变量函数结束就消失了,有的却一直存在?今天我们来深入理解C语言的内存布局。
一、内存的四个区域
C程序运行时,内存被分成四个主要区域:
高地址 ┌─────────────────┐ │ 栈区(Stack) │ ← 局部变量、函数参数 │ ↓ 向下增长 │ │ │ │ ↑ 向上增长 │ │ 堆区(Heap) │ ← malloc分配的空间 ├─────────────────┤ │ BSS段 │ ← 未初始化的全局/静态变量 ├─────────────────┤ │ 数据段(Data) │ ← 已初始化的全局/静态变量 ├─────────────────┤ │ 代码段(Text) │ ← 程序代码(只读) └─────────────────┘ 低地址生活比喻:把内存想象成一个大仓库——
- 代码段:操作手册(只读,不能改)
- 数据段/BSS段:公共储物柜(全局变量,整个程序都能用)
- 栈区:临时工作台(函数内的局部变量,用完自动清理)