C言語の基礎

C言語で free(p); の直後に p = NULL; と書くことが勧められる理由として、最も適切なものはどれか。

  1. ANULL を代入しないと、解放した領域が再び使える状態にならず、メモリリークになるから
  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言語の基礎の参考書を探す PR

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

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

  1. 上の関数 save に、8文字の文字列 "ABCDEFGH" を渡した。起こることとして正しいものはどれか。
  2. C言語で NULL ポインタを参照した(p が NULL のときに *p を読んだ)ときの説明として、正しいものはどれか。
  3. char は1バイト、int は4バイトで、int を4の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  4. uint32_t は32ビット、uint8_t は8ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  5. 3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。