
C/C++ 内存管理
程序运行时,内存分配分为 5 个区域:
1. 栈区(stack)
- 存放:局部变量、函数参数、函数返回地址
- 特点:自动分配、自动释放,速度极快
- 生命周期:函数执行时创建,函数结束自动销毁
2. 堆区(heap)
- 存放:手动申请的大块内存
- 特点:手动申请、手动释放,需要程序员管理
- 生命周期:从申请到释放为止,不释放就会内存泄漏
3. 全局 / 静态区(data segment)
- 存放:全局变量、static 静态变量
- 特点:程序一开始就存在,程序结束才释放
- 初始化的放
.data,未初始化的放.bss
4. 常量区(rodata)
- 存放:字符串常量、
const全局常量 - 特点:只读,不能修改,修改会崩溃
5. 代码区(text)
- 存放:编译后的二进制指令
- 特点:只读,共享
具体如下图:

向上增长(向高地址增长):新分配的内存地址越来越大 向下增长(向低地址增长):新分配的内存地址越来越小
面试注意:栈不一定是向下增长,只是现实中几乎所有主流平台都用'向下增长',主流操作系统(Windows/Linux/macOS)与主流 CPU 架构(x86/x86_64/ARM)的栈都是向下增长的。理论上栈可以向上增长,但现实工程中几乎不存在,因此把栈按向下增长的理解一定不会错。
堆也不一定是向上增长,不同操作系统、编译器不一样:Windows:堆向上增长(低→高),Linux:堆向上增长(低→高)。
1. C 语言的内存管理
C 只有 4 个函数负责堆内存:malloc / calloc / realloc / free
1. malloc 最常用:分配指定字节数的内存,内容随机
int* p = (int*)malloc(4); // 分配 4 字节
2. calloc(等价于 malloc + memset(0))
分配 + 自动清零
int* p = (int*)calloc(1, ());




