【发布时间】:2013-09-20 21:46:35
【问题描述】:
C99 标准在 6.7.5.3/7 中说明如下:
将参数声明为“类型数组”应调整为“限定指针” type'',其中类型限定符(如果有)是在 [ 和 ] 中指定的那些 数组类型推导。
我理解为:
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 标准引用所说的:它将
[]形式调整为*形式。因此两者是等价的。 (几乎)没有办法将整个数组按值传递给 C 函数。您只能传递一个指针并在函数体内手动复制。例外的是,记录中的数组字段在传值时会随记录一起传值。因此,有时您会看到一个数组字段的记录,其中记录只是包装数组以获得这种效果。 -
@Gene D'uh,我错误地将该标准段落作为对 C 程序员而非 C 编译器的指令阅读。愚蠢的我。