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

时间:2010-03-03 20:54:40

标签: c

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

A)

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

4 个答案:

答案 0 :(得分:5)

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

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

  

参数声明为   ''数组''应调整为   ''限定指向''的指针,在哪里   类型限定符(如果有的话)就是那些   在[和]中指定   数组类型推导。如果是关键字   静态也出现在[和]内   数组类型派生,然后为   每次调用函数,值   对应的实际论点   应提供访问第一个   数组元素至少为   由大小指定的许多元素   表达

和§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个双精度数组中的第一个,其他数组则没有。)

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

[删除]

请参阅最高投票答案。