C99标准说,在6.7.5.3/7以下:我可以在C99中使用数组作为函数参数吗?
一个参数作为“”“类型的数组”的声明,应调整至“”合格指针 类型“”,其中类型限定符(如果有)是在数组类型派生的[和]中指定的那些。
我的理解是:
void foo(int * arr) {} // valid
void foo(int arr[]) {} // invalid
然而,GCC 4.7.3会很乐意接受这两个函数定义,即使与gcc -Wall -Werror -std=c99 -pedantic-errors
编译。由于我不是C专家,我不确定我是否可能误解了标准的内容。
我也注意到,
size_t foo(int arr[]) { return sizeof(arr); }
总是返回的sizeof(int *)
代替数组大小,这公司我相信int arr[]
作为int *
处理和gcc只是试图让我感觉更舒服。
有人可以解释一下这个问题吗?仅供参考,此问题源自this comment。
编译器正在执行C99 std引用的说法:它将'[]'形式调整为'*'形式。因此这两者是等同的。几乎没有办法将整个数组按值传递给C函数。您只能传递一个指针并在函数体内手动创建副本。例外情况是,记录中的数组字段将在按值传递时与记录一起传递。因此,您有时会看到一个数组字段的记录,其中记录仅仅是包装数组以获得此效果。 – Gene
@Gene D'uh,我犯了一个错误,把这个标准的段落作为对C程序员的指令,而不是C编译器。愚蠢的我。 – nijansen