Ошибка компиляции C: «Объект с переменным размером не может быть инициализирован»
Почему я получаю сообщение об ошибке «Объект с переменным размером не может быть инициализирован» следующим кодом?
int boardAux[length][length] = {{0}};
- Являются ли множественные мутации в списке инициализаторов неопределенным поведением?
- Почему мой шаблон не принимает список инициализаторов
- Список инициализаторов C ++ 11 сбой - но только в списках длины 2
- Конструктор списка инициализаторов, заключенный в скобки
- Как инициализировать массив-член с помощью initializer_list?
Я предполагаю, что вы используете компилятор C99 (с поддержкой массивов с динамическим размером). Проблема в вашем коде заключается в том, что в момент, когда компиляторы видят объявление переменной, он не может знать, сколько элементов в массиве (я также предполагаю здесь, из compiler errors эта length
не является постоянной времени компиляции).
Вы должны вручную инициализировать этот массив:
int boardAux[length][length]; memset( boardAux, 0, length*length*sizeof(int) );
Вы получаете эту ошибку, потому что на языке C вам не разрешено использовать инициализаторы с массивами переменной длины. Сообщение об ошибке, которое вы получаете, в основном говорит все.
6.7.8 Инициализация
…
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";
После объявления массива
int boardAux[length][length];
самый простой способ назначения начальных значений как нуля используется для цикла, даже если он может быть немного длинным
int i, j; for (i = 0; i
Просто объявляйте длину символом минус, если это не так, вы должны динамически распределять память
Для отдельной декларации и инициализации C ++.
int a[n][m] ; a[n][m]= {0};
Еще один способ C ++:
const int n = 5; const int m = 4; int a[n][m] = {0};
Ты не можешь сделать это. Компилятор C не может делать такую сложную вещь в стеке.
Вы должны использовать кучу и динамическое распределение.
Что вам действительно нужно сделать:
- вычислить размер (n m sizeof (element)) требуемой памяти
- вызовите malloc (размер), чтобы выделить память
- создать accessor: int * access (ptr, x, y, rowSize) {return ptr + y * rowSize + x; }
Используйте * access (boardAux, x, y, size) = 42 для взаимодействия с матрицей.