C言語の基礎

C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。

  1. A(1) プログラムの終了まで、(2) 確保した関数から戻るまで、(3) プログラムの終了まで
  2. B(1) 宣言したブロックから抜けるまで、(2) free で解放するまで、(3) プログラムの終了まで
  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 でいつでも解放でき、関数の外の変数はプログラムの実行中ずっと存在します。
この分野を解く 分野ページへ

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

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

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

  1. int は32ビット(最大値 2147483647)とする。上の関数 fact(n) が、n の階乗をオーバーフローを起こさずに正しく返す最大の n はどれか。
  2. int は4バイト、ポインタは8バイトとする。int 型へのポインタ p の値(番地)が 0x1000 のとき、p + 3 の値はどれか。
  3. int は4バイト、ポインタは8バイトとする。上のプログラムを実行したときの出力として、正しいものはどれか。
  4. int は4バイトとする。上のコードを実行したときの出力として、正しいものはどれか。
  5. 文字列を入れた char の配列について、上のコードを実行したときの出力として、正しいものはどれか。