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


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

int boardAux[length][length] = {{0}};
8 66

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

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

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 (элемент)) из памяти вам нужно
  • вызов malloc (размер) для выделения памяти
  • создать метод доступа: инт* доступ(ПТР,х,м,размер строки) { возвращение ПТР + г*размер строки + х; }

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