在 C 语言中,程序运行时的数据存储位置由内存分区决定,不同分区对应不同生命周期、作用域的变量,核心分为 4 大内存区域(栈、堆、全局 / 静态存储区、常量存储区),部分教材会将全局 / 静态区细分为 “全局区” 和 “静态区”,本质属于同一大类。以下是详细解析:
一、核心内存分区总览
| 存储区域 | 存储内容 | 生命周期 | 作用域 | 分配 / 释放方式 | 特点 |
|---|---|---|---|---|---|
| 栈(Stack) | 局部变量、函数参数、返回值 | 函数调用时分配,调用结束释放 | 所在函数 / 代码块内(局部) | 编译器自动分配 / 释放 | 速度快、空间小(默认几 MB)、先进后出(FILO) |
| 堆(Heap) | 动态分配的变量(malloc/calloc/realloc 申请) | 手动分配后,手动释放(free) | 全局可访问(只要持有指针) | 程序员手动分配 / 释放 | 空间大(可到 GB 级)、灵活、需避免内存泄漏 |
| 全局 / 静态存储区 | 全局变量、静态变量(static 修饰,包括局部静态、全局静态) | 程序启动时分配,退出时释放 | 全局变量:整个程序;静态变量:所在文件 / 函数 | 编译器自动分配 / 释放 | 默认初始化为 0(或 NULL)、生命周期长 |
| 常量存储区(.rodata) | 字符串常量(如 "hello")、const 修饰的常量(只读) | 程序启动时分配,退出时释放 | 全局可访问(或局部可见) | 编译器自动分配 / 释放 | 只读(修改会触发未定义行为)、不可修改 |
二、各区域详细解析(含示例)
1. 栈(Stack):临时变量的 “临时仓库”
栈是编译器自动管理的内存区域,遵循 “先进后出”(FILO)原则,用于存储函数执行时的临时数据。
存储内容:
- 函数的局部变量(未加
static&nbs