C 語言內存五大區域
| 區域 | 特點 | 典型內容 |
| 棧區 | 編譯器自動管理,後進先出 | 局部變量、函數參數、返回地址 |
| 堆區 | 程序員手動管理(malloc/free/new/delete) | 動態分配內存 |
| 全局/靜態區 | 程序啟動分配,終了釋放 | 全局變量、static 變量(分初始化/未初始化兩塊) |
| 常量區 | 存放字面常量,不可修改 | 字符串字面值 "hello"、const 修飾的全局變量 |
| 代碼區 | 只讀,存放二進制指令 | 函數體機器碼 |
關鍵區別示例
int a = 0; // 全局初始化區
char *p1; // 全局未初始化區
void main() {
int b; // 棧
char s[] = "abc";// 棧(數組副本)
char *p2; // 棧(指針變量)
char *p3 = "123456"; // "123456" 在常量區,p3 在棧
static int c = 0;// 全局/靜態初始化區
p1 = (char*)malloc(10); // 堆
p2 = (char*)malloc(20); // 堆
strcpy(p1, "123456"); // "123456" 在常量區,編譯器可能合併優化
}
C++ 細分:自由存儲區 vs 堆
- 堆:
new/delete 管理,調用構造/析構函數。
- 自由存儲區:
malloc/free 管理,僅分配原始內存。
- 兩者物理上可能重疊,但語義不同,嚴禁混用(new 必須配 delete,malloc 必須配 free)。
補充說明
#define 不佔內存,純文本替換。
const 在 C++ 中編譯器常放入符號表(不分配內存),但在 VC 中可能仍分配空間。
- 函數體外
static 限定文件作用域;函數體內 static 限定函數作用域但生命周期為全程。
本文出自「IT民工一枚」博客,轉載請保留出處:原文鏈接