なぜ初期化するのか

初期化しろ、と聞くが何故初期化するか分からないので調べた。

 

ざっとみると、

  • 思わぬところでエラーとなるのを防ぐため。
    システム全体を把握していないなら、潜在的なバグを無くす為に必要。
  • 言語全般において、最初の値を明示的に設定する習慣が厳然として存在。

 

だが考えなしに初期化するな、という意見も。

  • 初期値を与えることでバグを隠蔽してしまう可能性もある。
  • しっかりと考え抜いて初期化するのはありだが、
    なんとなく初期化して動いたバンザイは NG。

 

潜在的なバグ、というのが意味が分からなかった。
C# では 値が設定されていない変数を参照するとコンパイルエラーとなるので
すぐに見つけられるよな、と思っていた。
 けど、初期化が必要な理由を C 言語 で見つけられた一応書いておく。

 

以下、C 言語について

代入されていない変数を参照しても明示的にエラーが出ない
( プログラムは問題なく動いているように見える。 )

代入されていない変数は、
想定していない数値 ( ゴミ ) が入っている可能性がある。
バグの温床なので、初期化する必要があり。

 

詳しく

関数や宣言に限らず、宣言をすればメモリ内のアドレスが割り振られる
ポインタは除く。
ポインタを宣言した時点ではアドレスは割り振られておらず、
他の変数、関数のアドレスが代入されて初めてアドレスが設定される。
メモリは malloc 関数で領域を確保しない限り、どのアドレスが
割り振られるかは決まっていない。

加えて、
割り振られたアドレスに宣言前に使用していたデータ ( ゴミデータ ) が
残っている可能性がある。
このゴミデータのせいで想定外の動きをしてしまう可能性がある。
下手するとシステム全体を壊す危険もあり。

そういった想定外の動きを防ぐために必ず初期化しなければならない。

 

つまり、
C 言語は変数を宣言した時、初期値はゴミデータとなってる。
ゴミはなんの値か分からないので、
そのまま使うと大抵バグることになる。
だから変数は必ず初期値を設定し、初期化を行う。

グローバル変数は、初期化しなくとも宣言時に値が代入される ( 自動初期化 ) 。

 

なお Java のサイトにおいて、

未初期化変数の参照によるエラーは、
「エラーを検出すること自体ができない致命的エラー」。
検出すること自体が不可能かつ何が起こるか予測できないやっかいなもの。
これを起こさないようにする為にコンパイル時にガード

とあった。故に、
他の言語でも宣言しただけの変数にはゴミが入っている。
初期化しないで使用するのを防ぐために、コンパイルエラーを
出しているようだ。

 

こちらから。

https://teratail.com/questions/49010 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?page=2&qid=11136098586
https://qiita.com/Ki4mTaria/items/b6ab0bcbe9c87d4dc071 https://www.grapecity.com/tools/support/powernews/column/clang/023/page03.htm https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11136098586 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1449816014 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1449805954

 

以上。

C 言語は初期化しないとその変数は不定値。故に初期化する、と覚えておく。
他の言語で初期化しろ云々は C 言語のなごり?