C,C++,javaでの未初期化変数の扱われ方

主に文字列の場合
ただfor文やif文を絡めるとまた挙動がかわってきます。
今回はprintでの文字列の出力のみです。

C言語の場合 int型の場合コンパイルエラーにならないがchar型の場合,
コンパイルエラーになる ×

char str[];  
   printf("%s\n",str);  

char str[] = "hoge";
   printf("%s\n",str);

javaの場合 コンパイルエラーにはならず実行してみるとnullが出力される。
ただオブジェクト参照の場合は実行時にNullPointerExceptionが起きる。

public class hello{
     static String name;
     public static void main(String[]args){
       System.out.println(name);
    }
}

C++の場合 コンパイルエラーにはならなかったがstd::endlの改行だけ出力された。

include <iostream>
  using namespace std;
 
  int main() {
     string name;
     std::cout << name << std::endl;
     return 0; 
  }  

結論

とりあえずバグの原因になるから初期化は必ずしよう

gccコンパイルした場合は-Wshadowオプションをつけたほうがいいみたいです。

-Wshadow ある局所変数が別の局所変数を隠す(shadow)場合に、 常に警告を出力します。