他の回答に加えて、これを考慮してください:配列とは何ですか?
Java や C# などのマネージ言語では、高レベルの抽象化を使用します。C と C++ は抽象化を提供しません (OO 機能のような言語の抽象化ではなく、ハードウェアの抽象化を意味します)。これらは、金属に近く動作するように設計されています。つまり、言語は抽象化せずにハードウェア (この場合はメモリ) を直接使用します。
つまり、int a
たとえば、ローカル変数を宣言すると、コンパイラは「わかりました。メモリのチャンクを[A,A + sizeof(int)]
整数として解釈します。これを 'a' と呼びます」 (A は先頭とそのチャンクの開始アドレスと関数のスタック フレームの開始アドレス)。ご覧のとおり、コンパイラはメモリ セグメントを変数に「割り当てる」だけです。変数の「作成」などの「魔法」は行いません。コードはマシンで実行され、マシンにはメモリと CPU しかないことを理解する必要があります。魔法はありません。
では、関数の実行が開始されたときの変数の値は何でしょうか? 変数のメモリのチャンクが持つデータで表される値。通常、そのデータは現在の観点からは意味がありません (たとえば、文字列によって以前に使用されたデータの一部である可能性があります)。そのため、その変数にアクセスすると、範囲外の値が取得されます。それは私たちが「ガベージ」と呼んでいるものです: 私たちの文脈では意味をなさない、以前に書かれたデータです。
同じことが配列にも当てはまります。配列は、配列のすべての値に適合する十分なスペースを備えた、より大きなメモリのチャンクです: [A,A + (length of the array)*sizeof(type of array elements)]
. 変数の場合と同様に、メモリにはがが含まれます。
一般に、配列の宣言中に一連の値を使用して配列を初期化する必要があります。初期化子リストを使用してそれを実現できます。
int array[] = {1,2,3,4};
その場合、コンパイラは関数にコードを追加して、配列がその値であるメモリチャンクを初期化します。
補足: 非 POD タイプと静的ストレージ
上記の説明は、基本型や基本型の配列などのPOD 型にのみ適用されます。クラスのような非 POD 型では、コンパイラは変数のコンストラクターへの呼び出しを追加します。これは、クラス インスタンスの値 (属性) を初期化するように設計されています。
また、POD 型を使用する場合でも、変数にstatic ストレージ指定がある場合、プログラムの開始時に static 変数が割り当てられるため、コンパイラは既定値でメモリを初期化します。