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

C 語言區塊內變數生命週期:塊結束即回收非函數返回時

     編輯:關於C語言

常見誤區

許多人誤以為區域變數在函數返回時才釋放,實則 塊({ })結束時即回收。

驗證範例

int *p[2];
for (int i = 0; i < 2; ++i) {
    int item = i;
    p[i] = &item;
    printf("p[%d]=%p *p[%d]=%d\n", i, p[i], i, *p[i]);
}
// 輸出顯示 p[0] 與 p[1] 指向同一記憶體位址

輸出示例:

p[0]=0023FE2C *p[0]=0
p[1]=0023FE2C *p[1]=1

結構體封裝後更具迷惑性

typedef struct { int item; } Node;
Node *p[2];
for (int i = 0; i < 2; ++i) {
    Node n = { i };
    p[i] = &n;
    printf("p[%d]=%p p[%d]->item=%d\n", i, p[i], i, p[i]->item);
}
// 同樣指向同一位址,item 值為最後一次賦值

正確做法

  • 若需跨塊使用,應動態配置記憶體(malloc)並手動釋放。
  • 或將變數宣告於較大作用域(如函數頂層)。

理解塊作用域生命週期,避免懸空指標導致未定義行為。

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