C 語言提供四種儲存類別指定符(auto、static、extern、register),決定變數在記憶體哪個區段分配空間(資料區、BSS區、堆疊、暫存器),並定義其可見範圍(作用域)與存活時間(生命週期)。深入理解這四者差異,是撰寫高效、無 Bug 程式的關鍵基礎。
autoauto(區域變數預設即為 auto,可省略)int main() {
auto int m = 99; // 等同於 int m = 99;
printf("%d\n", m);
return 0;
}
static// 對比 auto 與 static
#include <stdio.h>
int main() {
for (int i = 0; i < 3; i++) {
auto int m = 20; // 每次迴圈重新初始化
static int n = 20; // 僅第一次初始化
printf("m%d=%d, n%d=%d\n", i, m, i, n);
m++; n++;
}
return 0;
}
/* 輸出:
m0=20, n0=20
m1=20, n1=21
m2=20, n2=22
*/
externextern 僅聲明,不分配記憶體。定義處不可加 extern。// file1.c
int global_x = 10; // 定義,分配記憶體
// file2.c
extern int global_x; // 聲明,使用 file1 定義的變數
void foo() { printf("%d", global_x); }
register& 運算子)register 提示,自行最佳化分配register int counter = 0; // 建議放入暫存器 // int *p = &counter; // 錯誤:無法取址
| 特性 | auto | static (區域) | static (全域) | extern | register |
|---|---|---|---|---|---|
| 記憶體區段 | 堆疊 | 資料區 | 資料區 | 資料區/BSS | 暫存器/堆疊 |
| 生命週期 | 區塊執行期間 | 程式全程 | 程式全程 | 程式全程 | 區塊執行期間 |
| 作用域 | 區塊內 | 區塊內 | 檔案內 | 全域(跨檔) | 區塊內 |
| 預設初值 | 不定 | 0 | 0 | 0 (BSS) | 不定 |
| 可取址 | 是 | 是 | 是 | 是 | 否 |
| 跨檔可見 | 否 | 否 | 否 | 是 | 否 |
auto、register、區域 staticstatic 全域變數、static 函數auto(省略):最常見,自動管理生命週期。static:如計數器、快取、單例模式靜態實例。extern:.h 檔聲明 extern int g_var;,.c 檔定義 int g_var = 0;。register:現代編譯器最佳化優於人工提示,且限制較多。徹底掌握儲存類別機制,能幫你避開「未初始化變數」、「跨檔重複定義」、「靜態變數執行緒競爭」等經典坑洞,寫出更健壯、可維護的 C 程式碼。