进程的内存映像
32位系统内存布局
- 虚拟地址空间
- 4GB(0x00000000-0xFFFFFFFF)
- 内核区
- 高地址1GB(0xC0000000-0xFFFFFFFF)
- 存储操作系统内核代码、进程PCB、页表等
- 用户程序无法直接访问
- 用户区
- 低地址3GB(0x00000000-0xBFFFFFFF)
记住内核区在高端1GB,用户程序无法访问
用户区详细结构
- 1. 未使用区
- 0x00000000-0x08048000
- 2. 只读代码/数据区
- 从0x08048000开始
- 存储编译后的机器指令和const修饰的常变量
- 大小固定不变
- 3. 读写数据区
- 存储全局变量和static静态变量
- 大小固定
- 4. 堆区(heap)
- 由malloc/free动态管理
- 大小可动态增减,最大可达1GB
- 5. 共享库映射区
- 存储库函数代码(如printf)
- 6. 用户栈(stack)
- 存储函数调用的局部变量、参数及返回地址
从低到高记忆:未使用→只读→读写→堆→共享库→栈
变量存储区域
- 全局变量
- → 读写数据区
- static变量
- → 读写数据区
- const变量
- → 只读数据区
- malloc分配
- → 堆区
- 局部变量
- → 用户栈
- 库函数调用
- → 共享库映射区
考试重点:区分不同变量的存储位置
宏定义常量 vs const常变量
- 宏定义(如#define X 1024)
- 预处理阶段直接替换为字面值
- 不单独分配内存
- 通过立即数寻址方式嵌入指令
- const变量(如const int b=2)
- 存储在只读数据区
- 分配固定存储空间
- 运行时不可修改
关键区别:宏不占内存,const占用只读区
考试重点与易错点
- 易混淆点
- 宏定义与const的存储方式差异
- static变量的特殊存储位置
- 未初始化变量的存储区域判断
- 注意事项
- 内核区普通程序无法直接访问
- 栈溢出风险(如递归过深)
- 堆空间分配需考虑其他区域占用
常考:给出代码片段判断变量存储区域