C ошибка компиляции: "объект переменного размера не может быть инициализирован"
почему я получаю сообщение об ошибке "объект переменного размера не может быть инициализирован" со следующим кодом?
int boardAux[length][length] = {{0}};
8 ответов
Я предполагаю, что вы используете компилятор 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 не может сделать такую сложную вещь на стек.
вы должны использовать кучу и динамическое распределение.
Что вам действительно нужно сделать:
- вычислить размер (nmsizeof (element)) памяти, которая вам нужна
- вызовите malloc (размер), чтобы выделить память
- создайте метод доступа: int * access (ptr,x,y,rowSize) { return ptr + y*rowSize + x; }
использовать * доступ(boardAux, x, y, size) = 42 для взаимодействия с матрицей.