C言語の基礎
int *make(void) {
int x = 42;
return &x;
}上の関数 make が返すポインタについて、正しいものはどれか。
- Ax はプログラムの終了まで同じ場所に残るので、返したポインタを通していつでも42を安全に読める
- Bx は戻るときにヒープに移されるので、使い終わったら呼び出し側で free する必要がある
- Cx の寿命は関数から戻ると終わるので、返したポインタは無効な場所を指し、使うと未定義動作になる
答えと解説を見る
正解:C. x の寿命は関数から戻ると終わるので、返したポインタは無効な場所を指し、使うと未定義動作になる
x は static の付かない局所変数(自動変数)で、関数から戻るとその寿命は終わり、置かれていたスタックの場所はほかの関数の呼び出しで再び使われます。寿命の終わった領域を指すポインタをダングリングポインタといい、それを通して読み書きすると未定義動作になります。gcc ではこの書き方に警告が出て、NULL を返すコードが作られることもあります。値そのものを返すか、呼び出し側が用意した領域や malloc で確保した領域を使います。
- A. 自動変数は関数から戻ると寿命が終わり、その場所はほかの呼び出しで上書きされます。
- B. 自動変数がヒープに移されることはありません。
- C. 正しい。返したポインタはダングリングポインタになります。