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++, как это..

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

другой способ только C++:

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

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

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

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

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

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