Ошибка компиляции C:“Объект переменного размера может не быть инициализирован”
-
28-09-2019 - |
Вопрос
Почему я получаю сообщение об ошибке "Объект переменного размера, возможно, не инициализирован" со следующим кодом?
int boardAux[length][length] = {{0}};
Решение
Я предполагаю, что вы используете компилятор C99 (при поддержке массивов динамически размера). Проблема в вашем коде состоит в том, что в то время, когда компиляторы видно, что ваша переменная декларация не может знать, сколько элементов есть в массиве (я также предполагаю здесь, из ошибки компилятора, которая 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<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
Просто декларируйте длину, чтобы быть минусами, если это не тогда, вы должны динамически выделять память
Для C ++ отдельную декларацию и инициализацию, как это ..
int a[n][m] ;
a[n][m]= {0};
Вы не можете этого сделать.Компилятор C не может выполнять такую сложную работу в стеке.
Вы должны использовать кучу и динамическое распределение.
Что вам действительно нужно сделать:
- вычислительный размер (nmsizeof(элемент)) необходимой вам памяти
- вызовите malloc(размер), чтобы выделить память
- создайте средство доступа:int* доступ(ptr, x, y, размер строки) { возвращает ptr + y* Размер строки + x;}
Используйте *access(boardAux, x, y, size) = 42 для взаимодействия с матрицей.