我应该声明作为函数参数传递的数组的预期大小吗?

我认为两者都是有效的C语法,但哪个更好?

一个)

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

要么

B)

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

[删除]

请参阅最高投票的答案。

添加数组大小的主要原因是出于文档目的。 此外,使用C99,您可以在方括号内添加限定符,这些限定符将用于修改数组声明将在参数列表中发生时将转换为的指针声明。

参见C99规范,第6.7.5.3节,第7节:

将参数声明为”类型数组”应调整为”限定指向类型”,其中类型限定符(如果有)是在数组类型派生的[和]中指定的那些。 如果关键字static也出现在数组类型派生的[和]中,那么对于每次对函数的调用,相应的实际参数的值应该提供对数组的第一个元素的访问,其中元素的数量至少与指定的元素一样多。按大小表达。

和§21:

例5以下是所有兼容的函数原型声明符。

 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]); 

(注意,最后一个声明还指定在对f的任何调用中对应于a的参数必须是指向至少三个5个双精度数组中的第一个的非空指针,而其他数组则不是。)

实际上,它没有什么区别,因为无论如何大小都会丢失。

通常,对于大多数期望数组的函数,您将看到一个指针与数组的大小一起传递。 在C中,你总是需要跟踪arrays的大小。

防爆

 void func(int *ary,int szarry){...}