C語言基礎

C語言中,參考 NULL 指標(p 為 NULL 時讀取 *p)時的說明,下列何者正確?

  1. A標準規定一定會被偵測為執行時錯誤,在任何環境中都會顯示錯誤訊息並停止程式
  2. BNULL 規定指向0號位址,因此在任何環境中都會讀出0號位址的內容並繼續處理
  3. C是未定義行為,在作業系統上一般會異常終止,但在沒有MMU的微控制器上可能讀得到0號位址而沒有察覺
查看答案與解析

正確答案:C. 是未定義行為,在作業系統上一般會異常終止,但在沒有MMU的微控制器上可能讀得到0號位址而沒有察覺

參考 NULL 指標是未定義行為,會發生什麼事標準並未規定。Linux 或 Windows 不會在0號位址附近配置頁面,因此參考時會發生分頁錯誤,程式一般會異常終止(例如 Linux 的區段錯誤)。在沒有MMU的小型微控制器上,0號位址可能有快閃記憶體或中斷向量表而能夠讀取,錯誤可能沒有表現出來就造成誤動作。使用指標前確認它不是 NULL 非常重要。

  • A. 標準把參考 NULL 指標定為未定義行為,並未要求偵測。
  • B. 參考 NULL 指標是未定義行為。在作業系統上,0號位址附近不會被配置,多數情況下會異常終止。
  • C. 正確。依環境不同,可能異常終止,也可能在沒有察覺下繼續運作。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?
  2. uint32_t 與 uint8_t 分別是32位元與8位元的無號整數型別,且為小端序環境。執行上方程式碼時的輸出,下列何者正確?
  3. 執行上方把9放入3位元位元欄位的程式碼時的輸出,下列何者正確?
  4. 執行上方使用以 #define 定義之巨集 SQUARE 的程式碼時的輸出,下列何者正確?
  5. 標頭檔 sensor.h 寫成上方的樣子。#ifndef、#define、#endif 這3行的目的,下列何者正確?