C言語の基礎

int *make(void) {
    int x = 42;
    return &x;
}

上の関数 make が返すポインタについて、正しいものはどれか。

  1. Ax はプログラムの終了まで同じ場所に残るので、返したポインタを通していつでも42を安全に読める
  2. Bx は戻るときにヒープに移されるので、使い終わったら呼び出し側で free する必要がある
  3. Cx の寿命は関数から戻ると終わるので、返したポインタは無効な場所を指し、使うと未定義動作になる
答えと解説を見る

正解:C. x の寿命は関数から戻ると終わるので、返したポインタは無効な場所を指し、使うと未定義動作になる

x は static の付かない局所変数(自動変数)で、関数から戻るとその寿命は終わり、置かれていたスタックの場所はほかの関数の呼び出しで再び使われます。寿命の終わった領域を指すポインタをダングリングポインタといい、それを通して読み書きすると未定義動作になります。gcc ではこの書き方に警告が出て、NULL を返すコードが作られることもあります。値そのものを返すか、呼び出し側が用意した領域や malloc で確保した領域を使います。

  • A. 自動変数は関数から戻ると寿命が終わり、その場所はほかの呼び出しで上書きされます。
  • B. 自動変数がヒープに移されることはありません。
  • C. 正しい。返したポインタはダングリングポインタになります。
この分野を解く 分野ページへ

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

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

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

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