C言語の基礎

C言語で NULL ポインタを参照した(p が NULL のときに *p を読んだ)ときの説明として、正しいものはどれか。

  1. A規格で実行時のエラーとして必ず検出されることになっており、どの環境でもエラーのメッセージを出してプログラムが止まる
  2. BNULL は0番地を指すと決まっているので、どの環境でも0番地の内容が読み出され、そのまま処理が続く
  3. C未定義動作で、OSの上では一般に異常終了するが、MMUのないマイコンでは0番地を読めて気づかないこともある
答えと解説を見る

正解:C. 未定義動作で、OSの上では一般に異常終了するが、MMUのないマイコンでは0番地を読めて気づかないこともある

NULL ポインタの参照は未定義動作で、何が起こるかは規格では決まっていません。LinuxやWindowsでは0番地の付近にページを割り当てないので、参照するとページフォルトが起き、一般にプログラムは異常終了します(Linuxのセグメンテーション違反など)。MMUを持たない小さなマイコンでは、0番地にフラッシュメモリや割り込みベクタの表があって読めてしまうことがあり、誤りが表に出ないまま誤動作することがあります。ポインタを使う前に、NULL でないことを確かめることが大切です。

  • A. 規格は NULL ポインタの参照を未定義動作としていて、検出することまでは求めていません。
  • B. NULL ポインタの参照は未定義動作です。OSの上では0番地の付近は割り当てられず、多くの場合は異常終了します。
  • C. 正しい。環境によって、異常終了することも、気づかずに動き続けることもあります。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. char は1バイト、int は4バイトで、int を4の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  2. uint32_t は32ビット、uint8_t は8ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  3. 3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。
  4. #define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。
  5. ヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。