Как уже упоминалось, в С89 размер массива должен быть объявлен с помощью константных выражений. Поэтому компилятор С89 устанавливает фиксированный размер массива, не изменяющийся в процессе выполнения программы. Однако это не относится к С99, в котором определено новое мощное средство: массивы переменной длины. Стандарт С99 позволяет в объявлении размера массива использовать любые выражения, в том числе такие, значение которых становится известным только во время выполнения. Объявленный таким образом массив называется массивом переменной длины. Однако переменную длину могут иметь только локальные массивы (т.е. видимые в блоке или в прототипе). Приведем пример массива переменной длины:
void f(int dim) { char str[dim]; /* символьный массив переменной длины */ /* ... */ }
Здесь размер массива str определяется значением переменной dim, которая передается в функцию f() как параметр. Таким образом, при каждом вызове f() создается массив str разной длины.
Массивы переменной длины добавлены в С99 главным образом для поддержки численных методов обработки данных. В программировании это средство распространено достаточно широко. Однако следует помнить, что стандарт С89 (и некоторые компиляторы C++) не поддерживает массивы переменной длины. Более подробно этот вопрос рассматривается в части II.