リンカ・ローダと実行形式

C言語で、初期値を書かない局所変数とグローバル変数の、使い始めたときの値について正しいものはどれか。

  1. Aどちらも必ず0から始まる
  2. B局所変数は0から始まるが、グローバル変数の値は決まっていない
  3. Cグローバル変数は0から始まるが、局所変数の値は決まっていない(不定)
答えと解説を見る

正解:C. グローバル変数は0から始まるが、局所変数の値は決まっていない(不定)

グローバル変数や静的変数は.bssに置かれ、プログラムの開始時に0で埋められるので0から始まります。局所変数は関数が呼ばれるたびにスタック上に作られ、毎回0で埋めると時間がかかるため、前にその場所を使ったデータが残っているかもしれません。初期化しない局所変数を読むと結果が実行ごとに変わることがあるので、必ず初期化して使います。

  • A. 局所変数は0にする手間をかけないので不定です。
  • B. 逆です。
  • C. 正しい。置かれる場所の違いによるものです。
この分野を解く 分野ページへ

リンカ・ローダと実行形式のほかの問題

  1. mallocとfreeを繰り返すうちに、空きメモリの合計は十分あるのに、大きな領域をまとめて確保できなくなることがある。この現象を何と呼ぶか。
  2. 共有ライブラリを作るとき、外から使う関数だけを公開し、内部の関数はシンボルの可視性(visibility)を「hidden」にする利点として正しいものはどれか。
  3. C++でグローバルなオブジェクトのコンストラクタがmainより前に実行されるしくみとして正しいものはどれか。
  4. コンパイラが1つのソースファイルから出力するオブジェクトファイル(.o)について正しいものはどれか。
  5. リンカの主な役割として正しいものはどれか。