使用 static 關鍵字修飾局部變量,使其擁有靜態存儲期:程式啟動時分配、結束時釋放,函數多次調用間保持值不變(除非顯式修改)。
void counter() {
static int count = 0; // 僅初始化一次
printf("%d ", ++count);
}
int main() {
counter(); // 1
counter(); // 2
counter(); // 3
}
// file1.c
static int module_state = 0; // 僅本編譯單元可見
void set_state(int v) { module_state = v; }
int get_state() { return module_state; }
int *persist = malloc(sizeof(int));
*persist = 42;
// 跨函數傳遞指針,手動 free 才釋放
free,否則洩漏。| 特性 | static 局部 | static 全域 | malloc |
|---|---|---|---|
| 存儲區 | .bss/.data | .bss/.data | Heap |
| 作用域 | 函數內 | 檔案內 | 指針可達處 |
| 初始化 | 編譯期/首次執行 | 程式啟動 | 運行期手動 |
| 釋放時機 | 程式結束 | 程式結束 | 手動 free |
| 線程安全 | 否 | 否 | 視同步策略 |
static 不等於「常量」,值可修改;常量用 const。static 變量會被所有遞歸層級共享,通常改用參數傳遞狀態。static 變量讀寫需加互斥鎖或使用 C11 `.bss 段大小限制,大量 static 可能超出 RAM。static 局部變量。static 全域變量 + 存取函數。malloc/free 並明確所有權。