Должен ли я объявить ожидаемый размер массива, переданного в качестве аргумента функции? - PullRequest
2 голосов
/ 03 марта 2010

Я думаю, что это допустимый синтаксис C, но что лучше?

A)

void func(int a[]);  // Function prototype
void func(int a[]) { /* ... */ }  // Function definition

или

В)

#define ARRAY_SIZE 5
void func(int a[ARRAY_SIZE]);  // Function prototype
void func(int a[ARRAY_SIZE]) { /* ... */ }  // Function definition

Ответы [ 4 ]

5 голосов
/ 04 марта 2010

Основная причина добавления размера массива - в целях документации. Кроме того, с 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 двойных, чего нет у других.)

3 голосов
/ 03 марта 2010

На самом деле, это не имеет значения, потому что размер все равно теряется.

1 голос
/ 03 марта 2010

Как правило, для большинства функций, ожидающих массив, вы увидите указатель, переданный вместе с размером массива. В Си всегда нужно следить за размерами ваших массивов.

Ex

void func(int *ary,int szarry){...}
0 голосов
/ 03 марта 2010

[Удалено]

Пожалуйста, посмотрите ответ с наибольшим количеством голосов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...