C 指標與記憶體 · 整章複習測驗卷

10 題涵蓋取址解參考、指標算術、傳位址、動態配置、記憶體 bug · 達 90%(9/10)放行
尚未作答
這是整章複習測驗卷(精熟閘門 ⑦)。作答後按交卷自動算正確率:≥ 90% 過關完成本主題;未達則回 Quizlet / 講義 複習後再測。題型含預測輸出、抓 bug、填空與概念,每題交卷後顯示正解與解析。

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)

Q4int a[5]={10,20,30,40,50}; int *p=a;*(p+2) 的值是?預測輸出

30。*(p+i) 等同 a[i]p+2sizeof(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),所以要另外傳長度。