提问人:Dimpl 提问时间:10/8/2017 最后编辑:Paul RDimpl 更新时间:10/9/2017 访问量:691
为什么 C 数组在传递 size 时会衰减为指针
Why does a C array decay to a pointer when passed with size
问:
我理解为什么数组在传递给函数时会衰减为指针而不指定其大小,例如:
void test(int array[]);
为什么当它与大小一起传递时会这样做?例如。
void test(int array[3]);
我在后一个函数签名下遇到了问题,这令人沮丧,因为在编译时数组长度是清楚知道的。sizeof
答:
3赞
Valdrinium
10/8/2017
#1
void test(int* array);
void test(int array[]);
void test(int array[3]);
所有这些变体都是相同的。C 只允许您使用替代拼写,但即使是使用数组大小显式注释的最后一个变体也会衰减为指向第一个元素的指针。
也就是说,即使使用最后一个实现,您也可以使用任何大小的数组调用该函数:
void test(char str[10]) { }
test("test"); // Works.
test("let's try something longer"); // Still works.
没有神奇的解决方案,处理该问题的最易读的方法是使用数组 + 大小创建 a,或者简单地将大小作为附加参数传递给函数。struct
LE:请注意,此转换仅适用于数组的第一维。当传递给函数时,an 会转换为 ,而不是 。int[3][3]
int (*)[3]
int **
评论
0赞
Dimpl
10/9/2017
所以 int array[3] 比其他任何事情都更有利于程序员?
1赞
Valdrinium
10/9/2017
在我看来,它不应该被使用。它可能会给用户一种虚假的安全感(“哦,这个函数只接受长度为 3 的数组,所以我不需要自己检查长度”)
1赞
Jens Gustedt
10/8/2017
#2
因为您将无法正确调用此类函数。在几乎所有上下文中,数组都会衰减为指向第一个元素的指针,并且在尝试调用该函数时,数组将首先转换为指针,并且调用将不匹配。数组不衰减的唯一上下文是运算符 、 和 。这些更容易在句法上检测。sizeof
_Alignof
_Alignas
&
评论