C 程序中变量/数据在内存中的存储位置有哪几种
C 程序运行时,常见的存储区域主要有5 种区域存储内容生命周期可修改?.text函数机器指令程序全程❌(通常).rodata字符串常量、const全局变量程序全程❌.data已初始化全局/static变量程序全程✅.bss未初始化全局/static变量程序全程✅栈局部变量、返回地址、参数函数调用期间✅堆动态分配内存手动管理✅。
·
✅ 一句话总结:
C 程序运行时,常见的存储区域主要有 5 种:
🧠 C 程序的 5 大内存存储区域
区域 | 存放内容 | 生命周期 | 代表变量示例 |
---|---|---|---|
🟩 代码段 .text |
程序的指令/函数代码 | 程序整个运行期 | 函数本体、main() 、foo() |
🟨 常量区 .rodata |
只读常量,如字符串字面量、const 全局变量 |
程序整个运行期 | "abc" ,const int x = 3; |
🟦 数据段 .data |
初始化的全局变量、static 变量 |
程序整个运行期 | int g = 1; static int x = 2; |
🟧 BSS段 .bss |
未初始化的全局变量、static 变量 |
程序整个运行期 | int g; static int x; |
⬜ 栈区 Stack | 局部变量、函数参数、返回地址等 | 函数调用时分配/销毁 | int x; char *p; (函数中定义) |
⬛ 堆区 Heap | 动态分配的内存,如 malloc |
由程序员手动管理 | p = malloc(100) |
✅ 详细说明每个区域:
1️⃣ 代码段(.text
段)
- 储存:编译好的机器指令(函数体)
- 通常是只读的
- 举例:函数
main()
、你写的任何foo()
等
2️⃣ 常量区(.rodata
)
- 存放字符串字面量和
const
修饰的全局变量 - 只读不可修改
- 例子:
"hello"
、const int MAX = 100;
3️⃣ 数据段(.data
)
-
存放已初始化的全局变量、static变量
-
生命周期 = 程序运行全过程
-
可读写
-
例子:
int global_var = 42; static int local_static = 5;
4️⃣ BSS段(.bss
)
-
存放未初始化的全局变量、static变量
-
启动时自动清零
-
节省可执行文件大小
-
例子:
static int count; int global_flag;
5️⃣ 栈区(Stack)
-
每次函数调用都会开辟栈帧
-
用于:局部变量、函数参数、返回地址、保存寄存器
-
特点:后进先出,自动管理,生命周期随函数而生灭
-
例子:
void foo() { int x = 10; char *str = "abc"; // str 本身在栈上,指向的 "abc" 在 rodata }
6️⃣ 堆区(Heap)
-
动态分配,如
malloc
、calloc
、new
(C++) -
生命周期需程序员手动控制(
free
、delete
) -
程序员使用不当可能造成内存泄漏
-
例子:
char *buf = malloc(100);
✅ 可视化图结构:
高地址
┌──────────────────────────┐
│ 栈 Stack │ ← 函数调用临时变量、参数
├──────────────────────────┤
│ 堆 Heap │ ← malloc、动态对象
├──────────────────────────┤
│ BSS 段(未初始化) │ ← static int x; int g;
├──────────────────────────┤
│ 数据段(已初始化) │ ← static int x = 5;
├──────────────────────────┤
│ 只读常量 rodata │ ← "hello"
├──────────────────────────┤
│ 代码段 text │ ← main, 函数体
└──────────────────────────┘
低地址
✅ 总结表格:
区域 | 存储内容 | 生命周期 | 可修改? |
---|---|---|---|
.text |
函数机器指令 | 程序全程 | ❌(通常) |
.rodata |
字符串常量、const全局变量 | 程序全程 | ❌ |
.data |
已初始化全局/static变量 | 程序全程 | ✅ |
.bss |
未初始化全局/static变量 | 程序全程 | ✅ |
栈 | 局部变量、返回地址、参数 | 函数调用期间 | ✅ |
堆 | 动态分配内存 | 手动管理 | ✅ |

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)