変数の初期化 on 主記憶(C入門中)
仮引数と多次元配列の話(C入門中) - 虎塚
- 何もつけずに定義した変数は、初期値を与えないと、不定値で初期化される。auto、registerをつけて定義した変数も同じ。
- staticをつけて定義した変数は、初期値を与えないと、0で初期化される。main関数の実行前に生成され、プログラム終了時に消滅する。
という記述に対してコメントを頂いて、誤解が少しクリアになりました。というわけでメモ。
自分の誤解
- 初期化されないことを、不定値で初期化される=よくわからんデータで上書きされる
- データをpopしたら、popされたデータがあったスタックの位置はカラッポ(?)になる
主記憶へのデータの割り当て
今の理解を図にするとこんなかんじに。
スタックセグメントとデータセグメントは、どちらも動的に拡張される領域である。
スタックセグメントでpopが行われると、それまでデータが占めていた場所が使用可能になる。すでに書き込まれている値は、別の値で上書きされるまで、つまり、プログラムで明示的な初期化が行われるまで変更されないため、「以前にそこにあった値」が見えることになる。
×autoは不定値で初期化される → ○autoは初期化されない = スタックに配置されてそのまま使われる
・・・ということですね。
static変数がデータセグメントに保持される仕組みは、まだ調べ中。リンカとかローダとかよく分かってないのです。