Q1下列程式輸出是?預測輸出
int x = 10;
int *p = &x;
*p = 20;
printf("%d %d\n", x, *p);
20 20。p 指向 x,*p = 20 改的是 x 本人;之後 x 與 *p 讀同一格。
Q2要取得變數 x 的記憶體位址,應使用?
&x。& 是取址運算子;* 是解參考(用在指標上取值)。
Q3若把 swap 寫成 void swap(int a, int b)(傳值),呼叫 swap(x, y) 後?抓 bug
呼叫端不變。傳值只交換函式內的複本;要改呼叫端得傳位址 int *a, int *b 並呼叫 swap(&x, &y)。
Q4設 int a[5]={10,20,30,40,50}; int *p=a;,*(p+2) 的值是?預測輸出
30。*(p+i) 等同 a[i];p+2 以 sizeof(int) 為單位前移到 a[2]。
Q5函式回傳區域陣列的位址 return local;,呼叫端使用它會遇到?抓 bug
懸空指標。local 在 stack,函式返回即回收;回傳的位址失效。改用 malloc 或由呼叫端提供緩衝區。
Q6malloc 回傳後,使用前第一件該做的事是?
檢查是否為 NULL。配置可能失敗回 NULL,未檢查就解參考會崩。
Q7free(p); 之後,為避免懸空指標,最佳做法是?
p = NULL;。釋放後指標仍指向舊位址(懸空);設 NULL 後再誤用會明確出錯,且 free(NULL) 安全。
Q8一段含 use-after-free 的程式「跑一次沒當機」,代表?概念
仍是未定義行為。UB 可能時好時壞;用 clang -fsanitize=address 才會穩定現形。
Q9要動態配置「5 個 int」的陣列,正確寫法是?填空
malloc(5 * sizeof(int))。malloc 的參數是位元組數,要乘上每個元素的大小。
Q10陣列傳進函式後,在函式內對該參數用 sizeof,得到的是?
指標大小。陣列傳參數會退化成指標,sizeof 量到的是指標(如 8 byte),所以要另外傳長度。