web-dev-qa-db-ja.com

Cコンパイルエラー:「可変サイズのオブジェクトは初期化されない可能性があります」

次のコードで「可変サイズのオブジェクトが初期化されていない可能性があります」というエラーが表示されるのはなぜですか?

int boardAux[length][length] = {{0}};
80
helloWorld

私はあなたがC99コンパイラを使用していると仮定しています(動的なサイズの配列をサポートしています)。あなたのコードの問題は、コンパイラがあなたの変数宣言を見たときに、配列にある要素の数を知ることができないことです(私はここで、lengthはコンパイル時間ではないというコンパイラエラーからも仮定しています定数)。

その配列を手動で初期化する必要があります。

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );

C言語では、可変長配列で初期化子を使用できないため、このエラーが表示されます。あなたが得ているエラーメッセージは基本的にそれをすべて言います。

6.7.8初期化

...

3初期化されるエンティティの型は、サイズが不明な配列または可変長配列型ではないオブジェクト型でなければなりません。

22
AnT

これによりエラーが発生します。

int len;
scanf("%d",&len);
char str[len]="";

これもエラーになります:

int len=5;
char str[len]="";

しかし、これはうまくいきます:

int len=5;
char str[len]; //so the problem lies with assignment not declaration

次の方法で値を入力する必要があります。

str[0]='a';
str[1]='b'; //like that; and not like str="ab";
11
Amitesh Ranjan

配列を宣言した後

int boardAux[length][length];

初期値をゼロとして割り当てる最も簡単な方法は、たとえそれが少し長くてもforループを使用することです

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}
1

長さを短所として宣言するだけです。そうでない場合は、メモリを動的に割り当てる必要があります。

0
Azizou