Инициализация массива переменной длины

При инициализации компилятора массива переменной длины появляется сообщение об ошибке:

[Error] variable-sized object may not be initialized  

Фрагмент кода:

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n] = {0};

Как следует инициализировать Variable Length arrays? И почему все элементы не инициализируются 0 следующим образом:

   int board[n][n];
   board[n][n] = {0};

?

Ответы

Ответ 1

VLAs не может быть инициализирован с помощью любой формы синтаксиса инициализации. Вы должны назначить начальные значения вашим элементам массива после объявления в зависимости от того, какой вы предпочитаете.

C11: 6.7.9 Инициализация (p2 и p3):

Ни один инициализатор не должен пытаться предоставить значение для объекта, не содержащегося в инициализированном объекте.

Тип инициализируемого объекта должен быть массивом неизвестного размера или полным типом объекта , который не является массивом переменной длины.

Ответ 2

Вам нужно будет использовать memset:

memset(board, 0, sizeof board);

Ответ 3

Если вы хотите использовать VLA, вам нужно удалить инициализацию {0}

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n];

Ответ 4

1. Вы можете просто инициализировать массив следующим образом:

int n; 
printf("Enter size of magic square: ");
scanf("%d",&n);

int board[n][n];
for(int i=0; i<n; i++)
   for(int j=0; j<n; j++)
   {
      board[i][j] = 0;
   }
}

2. memset() следует использовать d только тогда, когда вы хотите установить массив в "0".