許多人誤以為區域變數在函數返回時才釋放,實則 塊({ })結束時即回收。
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)並手動釋放。理解塊作用域生命週期,避免懸空指標導致未定義行為。