配列を作成しchar
、char配列が空であると仮定するとします。配列()の最初の要素の値を確認するarr[0]
と、この式の結果はどうなりますか?
4 に答える
配列がどこでどのように宣言されているかによって異なります。
配列がファイル スコープで (関数の外で) 宣言されているか、宣言されstatic
ていて、明示的な初期化子を持たない場合、配列の内容は 0 に初期化されます。
配列がブロック スコープ (関数またはブロック内) で宣言され、宣言されstatic
ておらず、明示的な初期化子を持たない場合、配列の内容は不確定です (本質的に、ガベージ値であり、その一部はトラップ表現である可能性があります)。 .
配列が明示的に初期化されている場合は、初期化子に含まれていたものがすべて含まれます。
編集
以下のコメントに対応して、ブロック スコープ変数の暗黙的な初期化に依存するべきではないことに注意してください。作成時にブロック スコープの配列をゼロにする必要がある場合は、初期化子を使用します。
char foo[N] = {0};
初期化子の要素が配列の要素よりも少ない場合、初期化子の要素に対応する配列の要素は指定された値に設定されます。残りのエントリはすべて、宣言されているかのように暗黙的に初期化されstatic
ます。
上記の例では、これは、 の最初の要素foo
が明示的に に設定され0
、残りのすべての要素が暗黙的に に設定されることを意味し0
ます。
変数の場合auto
、明示的に初期化しない限り、ジャンクで埋められるため、デフォルト値はありません。arr[0]
他のものを含むように明示的に変更されるまで、一見ランダムな値が含まれる可能性があります。
もちろん、配列を初期化した場合(つまりmemset()
、for
ループや関数呼び出しなどを使用して配列に初期値を明示的に入力した場合)、期待どおりの値、つまり初期化した値が得られます。それ。
ただし、宣言と初期化の違いに注意してください。
void f(void) {
int x; // (1)
x = 10; // (2)
}
(1)で、auto
整数変数を宣言しています。現在、未定義の値があります(ジャンク)。(2)では、変数を初期化しています。現在、の値は10
です。
もちろん、宣言と初期化の両方を同時に行うことができます。
void f(void) {
int x = 10;
}
同じことが配列にも当てはまります。
void f(void) {
int x[2]; // x contains 2 junk values, so x[0] == junk
x[0] = 1; // x contains { 1, junk }, so x[0] == 1
x[1] = 2; // x contains { 1, 2 }, so x[0] == 1
}
または、それを宣言して初期化するには:
void f(void) {
int x[2] = { 1, 2 };
}
明示的に指定しない限り、変数を最初に初期化するときに特定の値を持つことを期待しないでください。自分で設定しない限り、ランダムなものでいっぱいになります。
アレイを開始するとき。あなたは静的メモリを割り当てています。そして、割り当てられたメモリの値を取得するので、ランダムな値になります
配列全体を 0 に設定する場合 ( Hunter McMillen Remark によると)
char arr[size] = { 0 }
またはmemset()
関数を使用する
memset(arr,0,sizeof_your_arr);