✅ 一句话总结:

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)

  • 动态分配,如 malloccallocnew(C++)

  • 生命周期需程序员手动控制(freedelete

  • 程序员使用不当可能造成内存泄漏

  • 例子:

    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变量 程序全程
局部变量、返回地址、参数 函数调用期间
动态分配内存 手动管理

Logo

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

更多推荐