解码C语言程序内存分布
虚拟内存概念
核心概念:每一个进程运行时,操作系统都会为其分配一块虚拟内存空间(一般4G大小)
- 目的:让开发者不再关心物理内存的具体处理
- 效果:每个进程都认为自己拥有完整且独立的内存空间
布局图示

栈内存 (Stack)
存储内容:
- 命令行参数
- 各个函数的局部变量
- 函数调用的返回地址
内存特性:
- 地址增长方向:从高地址向低地址增长
- 释放方向:从低地址向高地址释放
- 管理方式:系统自动管理
- 函数调用时自动申请
- 函数退出时自动释放
- 大小限制:默认较小(通常为8MB)
堆内存 (Heap)
存储内容:
- 任意数据(动态分配的内存)
内存特性:
- 理论增长方向:从低地址向高地址增长
- 实际分配方式:根据内存碎片情况灵活分配
- 管理方式:开发者完全自主管理
- 需要手动申请 (
malloc,calloc,realloc) - 需要手动释放 (
free)
- 需要手动申请 (
- 主要风险:内存泄漏问题
数据段 (Data Segment)
存储内容:所有静态数据
- 生命周期:随进程启动而创建,随进程退出而释放
数据段细分:
| 段名 | 存储内容 | 特点 |
|---|---|---|
| .bss | 未初始化的静态数据 | 默认初始化为0 |
| .data | 已初始化的静态数据 | 包含显式初始值 |
| .rodata | 只读数据 | 常量字符串、const变量等 |
代码段 (Text Segment)
- 地址:通常从
0x08048000开始 - 内容:程序的可执行指令
- 属性:只读、可执行
数据段细分:
| 段名 | 存储内容 | 特点 |
|---|---|---|
| .text | 用户代码 | 程序执行代码 |
| .init | 初始化代码 | 程序启动初始化代码 |

浙公网安备 33010602011771号