C言語の基礎
C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。
- A(1) プログラムの終了まで、(2) 確保した関数から戻るまで、(3) プログラムの終了まで
- B(1) 宣言したブロックから抜けるまで、(2) free で解放するまで、(3) プログラムの終了まで
- C(1) 宣言したブロックから抜けるまで、(2) プログラムの終了まで(途中では解放できない)、(3) その変数を最初に使った関数から戻るまで
答えと解説を見る
正解:B. (1) 宣言したブロックから抜けるまで、(2) free で解放するまで、(3) プログラムの終了まで
(1) の自動変数は、一般にスタックに置かれ、宣言したブロックに入ったときに作られて、抜けると無くなります。(2) の malloc で確保した領域はヒープに置かれ、関数から戻っても残り、free で解放するまで使えます。(3) の関数の外の変数(および static を付けた変数)は、プログラムの実行中ずっと存在し、.data や .bss のような静的な領域に置かれます。寿命の終わった領域を指すポインタを使うことや、free を忘れて領域が残り続けることが、よくある誤りの原因になります。
- A. 自動変数は宣言したブロックから抜けると無くなり、malloc の領域は関数から戻っても残ります。
- B. 正しい。自動・動的・静的の3種類の寿命の違いです。
- C. malloc の領域は free でいつでも解放でき、関数の外の変数はプログラムの実行中ずっと存在します。