在 C 語言中,每個變量除了數據類型外,還具備「存儲類別」屬性,決定了變量的生存期、作用域、鏈接屬性及內存佈局。本文系統梳理靜態/動態存儲方式,並深入剖析 auto、static、register 三大關鍵字的用法與差異。
auto — 自動變量(預設)static 聲明的局部變量均為自動變量。auto 可省略,不寫即隱含「自動存儲類別」。static 修飾局部變量 — 靜態局部變量經典例題:觀察靜態局部變量
c與自動變量b的差異int f(int a) { auto int b = 0; static int c = 3; b = b + 1; c = c + 1; return (a + b + c); } int main() { int a = 2, i; for (i = 0; i < 3; i++) printf("%d", f(a)); // 輸出:6 7 8 }
register — 寄存器變量& 操作非法);靜態局部變量不可聲明為 register。register 更多是程序員的提示而非強制。階乘函數示例:將循環變量
i與累積變量f聲明為寄存器int fac(int n) { register int i, f = 1; for (i = 1; i <= n; i++) f = f * i; return f; }
| 存儲類別 | 關鍵字 | 存儲區域 | 生存期 | 作用域 | 默認初值 |
|---|---|---|---|---|---|
| 自動變量 | auto(可省略) | 棧區 | 函數調用期間 | 塊作用域 | 不確定(垃圾值) |
| 靜態局部變量 | static | 靜態區 | 程序整個運行期間 | 塊作用域 | 0 或 '\0' |
| 寄存器變量 | register | CPU 寄存器(或棧) | 函數調用期間 | 塊作用域 | 不確定 |
| 全局變量 | (無,文件級聲明) | 靜態區 | 程序整個運行期間 | 文件作用域(外部鏈接) | 0 或 '\0' |
| 靜態全局變量 | static(文件級) | 靜態區 | 程序整個運行期間 | 文件作用域(內部鏈接) | 0 或 '\0' |
register:現代編譯器優化極佳,手動干預反而可能阻礙優化。static:限制作用域於本文件,減少符號衝突與副作用。