C語言基礎

C語言中,建議在 free(p); 之後立刻寫 p = NULL; 的理由,下列何者最適當?

  1. A若不指派 NULL,已釋放的區域就不會變回可用狀態,造成記憶體洩漏
  2. Bp 仍指向已釋放的區域,因此可防止重複釋放與釋放後使用,並使錯誤容易發現
  3. Cfree 會自動把 p 設為 NULL,但為了保險而再寫入一次相同的值來確認
查看答案與解析

正確答案:B. p 仍指向已釋放的區域,因此可防止重複釋放與釋放後使用,並使錯誤容易發現

free(p) 會釋放 p 原本指向的區域,但變數 p 的值(位址)保持不變。之後讀寫 *p 就是釋放後使用,再呼叫一次 free(p) 就是重複釋放,兩者都是未定義行為,可能破壞堆積的管理資訊,而在遠處引發異常。若把 p 設為 NULL,由於規定 free(NULL) 什麼都不做,重複釋放就無害,使用前的 NULL 檢查也能發現錯誤。不過,指向同一區域的其他指標變數仍需另外注意。

  • A. 區域在呼叫 free 的時間點就已釋放。指派 NULL 與是否釋放無關。
  • B. 正確。可防止釋放後使用與重複釋放,並使其容易發現。
  • C. free 不會改變 p 的值。呼叫之後,p 仍指向已釋放的位址。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 把8個字元的字串 "ABCDEFGH" 傳給上方的函式 save。會發生的事,下列何者正確?
  2. C語言中,參考 NULL 指標(p 為 NULL 時讀取 *p)時的說明,下列何者正確?
  3. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?
  4. uint32_t 與 uint8_t 分別是32位元與8位元的無號整數型別,且為小端序環境。執行上方程式碼時的輸出,下列何者正確?
  5. 執行上方把9放入3位元位元欄位的程式碼時的輸出,下列何者正確?