Подтвердить что ты не робот

Ошибка компиляции C: "Объект с переменным размером не может быть инициализирован"

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

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

Ответ 1

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

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

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

Ответ 2

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

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

...

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

Ответ 3

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

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";

Ответ 4

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

int boardAux[length][length];

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

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

Ответ 5

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

Ответ 6

Для отдельной декларации и инициализации С++.

int a[n][m] ;
a[n][m]= {0};

Ответ 7

Другой способ C++:

const int n = 5;
const int m = 4;
int a[n][m] = {0};

Ответ 8

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

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

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

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

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