进程的内存映像

🧠
32位系统内存布局
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
宏定义常量 vs const常变量
宏定义(如#define X 1024)
预处理阶段直接替换为字面值
不单独分配内存
通过立即数寻址方式嵌入指令
const变量(如const int b=2)
存储在只读数据区
分配固定存储空间
运行时不可修改
关键区别:宏不占内存,const占用只读区
⚠️
考试重点与易错点
考试重点与易错点
易混淆点
宏定义const的存储方式差异
static变量的特殊存储位置
未初始化变量的存储区域判断
注意事项
内核区普通程序无法直接访问
栈溢出风险(如递归过深)
堆空间分配需考虑其他区域占用
常考:给出代码片段判断变量存储区域