この構文の意味を尋ねられました:
char data[32] = {1};
しかし、私はそれが何をするのか思い出せません。しかし、私はそれが有効であることを覚えています。
誰かがその目的を説明できますか?
これにより、32 文字の配列が作成されます。最初の要素は 1 になり、残りは 0 に設定されます。
自動配列 (静的ではなくローカル) をまったく初期化しない場合、配列の要素にガベージ値が含まれる可能性があります。
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
char data[5];
for (i = 0; i < 5; i++) {
printf("data[%d] = %d\n", i, data[i]);
}
return 0;
}
出力:
data[0] = 72
data[1] = 12
data[2] = -118
data[3] = 51
data[4] = -119
ただし、初期化すると、指定した初期化子で初期化されます。初期化子の数が配列内の要素の総数よりも少ない場合、残りの要素は 0 に初期化されます。
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
char data[5] = {1};
for (i = 0; i < 5; i++) {
printf("data[%d] = %d\n", i, data[i]);
}
return 0;
}
出力:
data[0] = 1
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0
初期化です。値の配列の最初の要素を1
(^A
私がチェックした ASCII テーブルで) に設定し、残りを0
(デフォルト) に設定します。
省略された初期化子に関する C99 標準を述べるには:
集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。
と:
自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:
- ポインター型の場合は、null ポインターに初期化されます。
- 算術型の場合は、(正または符号なし) ゼロに初期化されます。
- 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。
- 共用体の場合、最初に指定されたメンバーは、これらの規則に従って (再帰的に) 初期化されます。
Andchar
は算術型であるため、配列の残りの要素はゼロに初期化されます。
はい、あなたは正しく覚えています。「C配列の初期化」についてはGoogleのみ:
いくつかのメモ:
ANSI 以前の古い C コンパイラでは、関数内の「ローカル」配列の初期化子を常に指定できるとは限りませんでした。関数の外部にある「グローバル」配列のみを初期化できます。これらのコンパイラは現在ではまれになっているため、この違いについて心配する必要はもうありません。
配列定義に初期化子が含まれている場合、配列の次元は省略される場合があり、コンパイラは初期化子の数から次元を推測します。
配列内の要素よりも初期化子が少ない場合、残りの要素は自動的に 0 に初期化されます。