Основная причина добавления размера массива - в целях документации. Кроме того, с C99 вы можете добавить квалификаторы в квадратных скобках, которые будут использоваться для изменения объявления указателя, в которое будет преобразовано объявление массива, если оно происходит в списке параметров.
См. Спецификацию C99, раздел 6.7.5.3, §7:
Объявление параметра как
‘‘ Массив типа ’’ должен быть скорректирован до
‘‘ Квалифицированный указатель на тип ’’, где
квалификаторы типа (если есть)
указано в [и] из
вывод типа массива. Если ключевое слово
статика также появляется внутри [и]
деривации типа массива, то для
каждый вызов функции, значение
соответствующего фактического аргумента
обеспечит доступ к первому
элемент массива, по крайней мере, как
много элементов в зависимости от размера
выражение.
и §21:
ПРИМЕР 5 Следующие все
совместимый прототип функции
declarators.
double maximum(int n, int m, double a[n][m]);
double maximum(int n, int m, double a[*][*]);
double maximum(int n, int m, double a[ ][*]);
double maximum(int n, int m, double a[ ][m]);
как:
void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);
void f(double a[restrict static 3][5]);
(Обратите внимание, что последнее объявление также указывает, что аргумент, соответствующий a в любом вызове f, должен быть
ненулевой указатель на первый из как минимум трех массивов из 5 двойных, чего нет у других.)