一个典型的可执行程序在运行时的内存布局大致如下:
| 区域 | 英文名 | 内容 | 特性 |
|---|---|---|---|
| 代码段 | .text |
可执行机器指令 | 只读 + 可执行 |
| 只读数据段 | .rodata |
常量字符串、const 全局变量(有时) |
只读 |
| 数据段 | .data |
已初始化的全局/静态变量 | 可读可写 |
| BSS 段 | .bss |
未初始化的全局/静态变量 | 可读可写,程序启动时清零 |
| 堆 | heap | 动态分配的内存(new / malloc) |
可读可写 |
| 栈 | stack | 局部变量、函数调用信息 | 可读可写 |
常量区≈只读数据段,可以对照上下进行匹配。
| 区域 | 说明 |
|---|---|
| 代码区 (Text Segment) | 存放程序指令、常量字符串、只读常量 |
| 全局/静态区 (Data Segment) | 存放全局变量、静态变量(分为初始化和未初始化两部分) |
| 常量区 (Read-only Segment) | 通常包含只读常量,如 "abc" 字符串字面量、const 全局常量 |
| 栈区 (Stack) | 局部变量、函数参数 |
| 堆区 (Heap) | 动态分配(new / malloc)的数据 |
| 情况 | 是否在常量区 | 说明 |
|---|---|---|
const int a = 10; (在函数外) |
✅ 常量区(只读) | 全局作用域,静态存储期 |
const int a = 10; (函数内) |
❌ 栈区 | 局部变量,仍在栈上,只是不能改值 |
static const int a = 10; |
✅ 静态区(可能合并到常量区) | 静态存储期 |
const char* s = "hello"; |
"hello" ✅ 在常量区s ❌ 在栈区 |
指针在栈上,指向常量区字符串 |
const int arr[] = {1,2,3}; (全局) |
✅ 常量区 | 静态存储期 |
const int arr[] = {1,2,3}; (函数内) |
❌ 栈区 | 数组内容在栈上,不能修改 |
关于C++中是否给const全局变量开辟空间,可以看这一篇博文:c语言中const修饰的局部变量和全局变量存放在哪个区域_const定义的全局常量存储在-CSDN博客