Ошибка компиляции C: «Объект переменного размера не может быть инициализирован» - PullRequest
78 голосов
/ 21 июня 2010

Почему я получаю сообщение об ошибке «Объект переменного размера не может быть инициализирован» со следующим кодом?

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

Ответы [ 7 ]

91 голосов
/ 21 июня 2010

Я предполагаю, что вы используете компилятор C99 (с поддержкой динамически изменяемых массивов). Проблема в вашем коде состоит в том, что в то время, когда компиляторы видят объявление вашей переменной, он не может знать, сколько элементов в массиве (я также предполагаю, что из ошибки компилятора length не является постоянной времени компиляции) ,

Вы должны вручную инициализировать этот массив:

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
22 голосов
/ 21 июня 2010

Вы получаете эту ошибку, потому что в языке C вам не разрешено использовать инициализаторы с массивами переменной длины. Сообщение об ошибке, в основном, говорит само за себя.

6.7.8 Инициализация

...

3 Тип объекта, который должен быть инициализирован, должен быть массив неизвестного размера или объект тип, который не является переменной длины тип массива.

11 голосов
/ 08 ноября 2014

Это дает ошибку:

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";
1 голос
/ 27 марта 2016

После объявления массива

int boardAux[length][length];

Самый простой способ присвоить начальные значения нулю - использовать для цикла, даже если он может быть длинным

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}
0 голосов
/ 25 сентября 2016

Для C ++ отдельное объявление и инициализация, как это ..

int a[n][m] ;
a[n][m]= {0};
0 голосов
/ 02 марта 2016

Просто объявите длину как минус, если это не так, вы должны динамически распределять память

0 голосов
/ 21 июня 2010

Вы не можете сделать это.Компилятор C не может делать такие сложные вещи в стеке.

Вы должны использовать кучу и динамическое распределение.

Что вам действительно нужно сделать:

  • вычислить размер(n m sizeof (элемент)) необходимой вам памяти
  • вызовите malloc (size) для выделения памяти
  • создайте метод доступа: int * access (ptr,x, y, rowSize) {return ptr + y * rowSize + x;}

Используйте * access (boardAux, x, y, size) = 42 для взаимодействия с матрицей.

...