首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言 static 關鍵字深度解析:函數內靜態局部變量的生命週期與累加效應

     編輯:C 語言問答

經典面試題代碼


int func(int n) {
    static int m = 0;  // 靜態局部變量
    m = m + n;
    return m;
}

int main() {
    int i, a = 0;
    for (i = 1; i <= 4; i++)
        a += func(i);
    printf("%d\n", a);  // 輸出 20
    return 0;
}

執行流程圖解

調用次數參數 nm 初始值m = m + n返回值累加 a
110111
221334
3336610
446101020

最終 a = 1+3+6+10 = 20

去掉 static 後的差異


int func(int n) {
    int m = 0;  // 自動局部變量,每次調用重新創建、初始化、銷毀
    m = m + n;
    return m;
}
調用次數參數 nm 值返回值累加 a
11111
22223
33336
444410

最終 a = 1+2+3+4 = 10

核心機制對比

特性static 局部變量自動局部變量
存儲區靜態存儲區 (.data/.bss)棧
初始化僅首次調用前初始化一次每次調用時初始化
生命週期程序整個運行期間函數調用期間
值的保持調用間保持值調用間不保持

典型應用場景

  • 函數調用計數器
  • 單例模式的懶漢式初始化
  • 遞歸函數的中間狀態緩存
  • 保持狀態的回調函數

⚠️ 注意事項

  1. 線程不安全:多線程並發訪問需加鎖
  2. 初始化順序:C++ 靜態局部變量初始化有線程安全保證 (C++11),C 標準無此保證
  3. 不要過度使用,優先考慮傳遞狀態結構體指針

掌握 static 在不同位置(全局、函數內、類成員)的語義差異,是 C/C++ 進階的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved