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

StackOverflow https://stackoverflow.com/questions/3082914

Вопрос

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

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 для взаимодействия с матрицей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top