Это утверждение
int array[a]={0};
объявляет переменную длину Array (VLA).
Согласно стандарту C (6.7.9) Инициализация
3 типа объекта, чтобы быть инициализирован должен быть массивом неизвестного размера или полный тип объекта , который не является переменной длины массив type.
Проблема заключается в том, что компилятор должен знать размер массива во время компиляции, чтобы сгенерировать код, инициализирующий массив.
Рассмотрим пример
void f(size_t n)
{
int a[n] = { 1, 2, 3, 4, 5 };
//...
}
Вот является переменной массива длины. Теперь, когда n может иметь любое значение, количество инициализаторов в определении массива может быть больше размера массива. Таким образом, этот код нарушает стандарт с другой стороны, потому что количество инициализаторов может быть не больше числа элементов массива. С другой стороны, если количество инициализаторов меньше числа элементов массива, то что делать в этом случае? Возможно, программист не имел в виду, что некоторые элементы должны быть инициализированы нулями.
Что касается этого заявления
int array[5]={0};
, то нет переменной массива длины. Размер массива известен во время компиляции. Поэтому нет проблем
.
использовать '-std = c99' как CFLAGS при компиляции этой программы –
@Bhuvanesh Вы проверили свой код с помощью cc -E. В этой переменной отсутствует значение, которое должно быть помещено в размер массива. –