C言語の基礎
C言語で NULL ポインタを参照した(p が NULL のときに *p を読んだ)ときの説明として、正しいものはどれか。
- A規格で実行時のエラーとして必ず検出されることになっており、どの環境でもエラーのメッセージを出してプログラムが止まる
- BNULL は0番地を指すと決まっているので、どの環境でも0番地の内容が読み出され、そのまま処理が続く
- C未定義動作で、OSの上では一般に異常終了するが、MMUのないマイコンでは0番地を読めて気づかないこともある
答えと解説を見る
正解:C. 未定義動作で、OSの上では一般に異常終了するが、MMUのないマイコンでは0番地を読めて気づかないこともある
NULL ポインタの参照は未定義動作で、何が起こるかは規格では決まっていません。LinuxやWindowsでは0番地の付近にページを割り当てないので、参照するとページフォルトが起き、一般にプログラムは異常終了します(Linuxのセグメンテーション違反など)。MMUを持たない小さなマイコンでは、0番地にフラッシュメモリや割り込みベクタの表があって読めてしまうことがあり、誤りが表に出ないまま誤動作することがあります。ポインタを使う前に、NULL でないことを確かめることが大切です。
- A. 規格は NULL ポインタの参照を未定義動作としていて、検出することまでは求めていません。
- B. NULL ポインタの参照は未定義動作です。OSの上では0番地の付近は割り当てられず、多くの場合は異常終了します。
- C. 正しい。環境によって、異常終了することも、気づかずに動き続けることもあります。