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

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

[Error] variable-sized object may not be initialized  

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

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

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

Как следует инициализировать массивы переменной длины? И почему все элементы не инициализированы как 0, как указано ниже;

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

?


person haccks    schedule 26.06.2013    source источник


Ответы (3)


VLA нельзя инициализировать никаким синтаксисом инициализации. Вы должны присвоить начальные значения вашим элементам массива после объявления любым удобным для вас способом.

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

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

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

person AnT    schedule 27.06.2013
comment
вы хотите сказать int board[n][n]; board[n][n] = {0};. правильно? - person haccks; 27.06.2013
comment
@haccks: Нет. Массивы не присваиваются. Вот почему я сказал присвоить начальные значения вашему массиву elements. За исключением таких операций с необработанной памятью, как memset или memcpy, это должно выполняться поэлементно. Итак, я хотел сказать for (i = 0; i < n; ++i) ... и так далее. - person AnT; 27.06.2013
comment
Я читал, что массив может быть инициализирован как array[m][n] = {0}, это инициализирует его первый элемент как 0, а остальные элементы инициализируются как 0. - person haccks; 27.06.2013
comment
@haccks: Initialized означает, что = { 0 } можно указать в качестве инициализатора в объявлении. То, что у вас есть в вашем первом комментарии, совершенно неверно. И даже в декларации он работает только с массивами, не относящимися к VLA. Например, вы можете сделать int array[10][10] = { 0 }. Но этот вопрос конкретно о массивах VLA. Массивы VLA не принимают инициализаторы. Вы не можете делать int array[m][n] = { 0 }, если m и n не являются константами. - person AnT; 27.06.2013

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

memset(board, 0, sizeof board);
person Carl Norum    schedule 26.06.2013
comment
Я понятия не имею о memset(). - person haccks; 27.06.2013
comment
Что это обозначает? - person Carl Norum; 27.06.2013
comment
@haccks, вы просто поместили это под своей строкой int board[n][n];. И убедитесь, что вы #include <string.h> - person i Code 4 Food; 27.06.2013
comment
#include <string.h> для C. - person Carl Norum; 27.06.2013
comment
Вы хотели инициализировать его как 0, верно? - person Carl Norum; 27.06.2013
comment
memset чистый, вы также можете сдвинуть влево размер массива… В этом случае * board ‹* = n * n; - person llange; 11.02.2018

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 () следует использовать только в том случае, если вы хотите установить для массива значение «0».

person Parag Gangil    schedule 24.12.2013
comment
... memset () следует использовать только тогда, когда вы хотите установить массив в 0. Ху! Почему это? - person alk; 24.12.2013
comment
@alk: функция memset() заполняет первые n байтов области памяти, на которую указывает s, постоянным байтом c. Принимая во внимание, что размер целого числа обычно составляет 4 байта, поэтому мы не можем установить целое число в желаемое число, но 0 - это особый случай, поскольку с 0 memset() устанавливает все байты в 0. - person Parag Gangil; 26.12.2013
comment
@ParagGangil; memset () следует использовать только в том случае, если вы хотите установить для массива значение 0: Не верно . - person haccks; 10.03.2015