変数の初期化 on 主記憶(C入門中)

  • 何もつけずに定義した変数は、初期値を与えないと、不定値で初期化される。auto、registerをつけて定義した変数も同じ。
  • staticをつけて定義した変数は、初期値を与えないと、0で初期化される。main関数の実行前に生成され、プログラム終了時に消滅する。
仮引数と多次元配列の話(C入門中) - 虎塚

という記述に対してコメントを頂いて、誤解が少しクリアになりました。というわけでメモ。

自分の誤解

  • 初期化されないことを、不定値で初期化される=よくわからんデータで上書きされる
  • データをpopしたら、popされたデータがあったスタックの位置はカラッポ(?)になる

主記憶へのデータの割り当て

今の理解を図にするとこんなかんじに。

スタックセグメントとデータセグメントは、どちらも動的に拡張される領域である。

スタックセグメントでpopが行われると、それまでデータが占めていた場所が使用可能になる。すでに書き込まれている値は、別の値で上書きされるまで、つまり、プログラムで明示的な初期化が行われるまで変更されないため、「以前にそこにあった値」が見えることになる。

×autoは不定値で初期化される → ○autoは初期化されない = スタックに配置されてそのまま使われる

・・・ということですね。

static変数がデータセグメントに保持される仕組みは、まだ調べ中。リンカとかローダとかよく分かってないのです。