本文最后更新于 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)

  • 存储内容:动态分配的内存(malloccalloc等)
  • 特点:由程序员手动管理,空间大但需避免内存泄漏
  • 生命周期:手动分配后,手动释放(free)或程序退出
  • 示例int *p = (int *)malloc(sizeof(int));

存储区域对比表

区域存储内容生命周期分配/释放方式特点
代码段函数代码程序整个运行期编译器自动只读
常量区字符串常量、const变量程序整个运行期编译器自动只读
数据段已初始化全局/静态变量程序整个运行期编译器自动可读写
BSS段未初始化全局/静态变量程序整个运行期编译器自动启动时清零
栈区局部变量、函数参数函数调用期间编译器自动速度快、空间小
堆区动态分配的内存手动控制程序员手动空间大、需手动管理

重要说明

  • 栈区:遵循"先进后出"原则,空间有限(默认几MB),过度使用可能导致栈溢出
  • 堆区:动态内存分配,生命周期由程序员控制,是内存泄漏的高发区
  • 常量区:字符串字面量和const变量都存储在常量区,修改会触发未定义行为
  • 局部变量:在函数内部定义的变量(未用static修饰)存储在栈区

理解这些存储区域对于编写高效、稳定且无内存泄漏的C程序至关重要。