46-c语言数据存储位置
本文最后更新于 2026-03-06,文章内容可能已经过时。
C语言程序的数据存储位置分为六个主要区域:代码段(存储函数指令,只读,程序全程存在)、常量区(存储字符串字面量和
const变量,只读,程序全程存在)、数据段(存储已初始化全局/静态变量,可读写,程序全程存在)、BSS段(存储未初始化全局/静态变量,启动时清零,程序全程存在)、栈区(存储局部变量和函数参数,编译器自动分配/释放,生命周期短,函数调用期间存在)以及堆区(存储动态分配内存,程序员手动管理,生命周期由malloc/free控制)。
在C语言中,程序运行时的数据存储位置由内存分区决定,主要分为以下6大内存区域:
1. 代码段(.text / CODE)
- 存储内容:程序的机器指令(函数代码)
- 特点:只读,程序运行期间一直存在
- 生命周期:程序整个运行期
- 示例:
main()函数、自定义函数体
2. 常量区(.rodata / RO DATA)
- 存储内容:字符串字面量、
const修饰的常量 - 特点:只读不可修改(修改会触发未定义行为)
- 生命周期:程序整个运行期
- 示例:
"Hello, World!"、const int MAX = 100;
3. 数据段(.data / RW DATA)
- 存储内容:已初始化的全局变量、
static变量 - 特点:可读写,程序加载时已初始化
- 生命周期:程序整个运行期
- 示例:
int global_var = 42;、static int local_static = 5;
4. BSS段(.bss)
- 存储内容:未初始化的全局变量、
static变量 - 特点:启动时自动清零,节省可执行文件大小
- 生命周期:程序整个运行期
- 示例:
int global_flag;、static int count;
5. 栈区(Stack)
- 存储内容:局部变量、函数参数、返回地址
- 特点:由编译器自动分配和释放,遵循后进先出(LIFO)原则
- 生命周期:函数调用时分配,函数返回时释放
- 示例:
void func() { int x = 10; char *str = "abc"; }
6. 堆区(Heap)
- 存储内容:动态分配的内存(
malloc、calloc等) - 特点:由程序员手动管理,空间大但需避免内存泄漏
- 生命周期:手动分配后,手动释放(
free)或程序退出 - 示例:
int *p = (int *)malloc(sizeof(int));
存储区域对比表
| 区域 | 存储内容 | 生命周期 | 分配/释放方式 | 特点 |
|---|---|---|---|---|
| 代码段 | 函数代码 | 程序整个运行期 | 编译器自动 | 只读 |
| 常量区 | 字符串常量、const变量 | 程序整个运行期 | 编译器自动 | 只读 |
| 数据段 | 已初始化全局/静态变量 | 程序整个运行期 | 编译器自动 | 可读写 |
| BSS段 | 未初始化全局/静态变量 | 程序整个运行期 | 编译器自动 | 启动时清零 |
| 栈区 | 局部变量、函数参数 | 函数调用期间 | 编译器自动 | 速度快、空间小 |
| 堆区 | 动态分配的内存 | 手动控制 | 程序员手动 | 空间大、需手动管理 |
重要说明
- 栈区:遵循"先进后出"原则,空间有限(默认几MB),过度使用可能导致栈溢出
- 堆区:动态内存分配,生命周期由程序员控制,是内存泄漏的高发区
- 常量区:字符串字面量和
const变量都存储在常量区,修改会触发未定义行为 - 局部变量:在函数内部定义的变量(未用
static修饰)存储在栈区
理解这些存储区域对于编写高效、稳定且无内存泄漏的C程序至关重要。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

