![](/img/trans.png)
[英]Why does decay to pointer for array argument appear not to apply to sizeof()?
[英]Why does a C array decay to a pointer when passed with size
我理解为什么数组在传递给函数时未指定其大小就衰减为指针,例如:
void test(int array[]);
为什么在传递大小时这样做呢? 例如。
void test(int array[3]);
我在后一个函数签名下使用sizeof
遇到了麻烦,这很令人沮丧,因为在编译时很清楚地知道了数组的长度。
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.
没有神奇的解决方案,处理该问题的最易读的方法是使用数组+ size创建struct
,或者简单地将size作为附加参数传递给函数。
LE:请注意,此转换仅适用于数组的第一维。 当传递给函数时, int[3][3]
会转换为int (*)[3]
,而不是int **
。
因为您将无法正确调用此类函数。 在几乎所有情况下,数组都会衰减为指向第一个元素的指针,并且在任何调用该函数的尝试中,数组都会首先转换为指针,并且该调用将是不匹配的。 当阵列不衰减的唯一上下文是运营商sizeof
, _Alignof
, _Alignas
和&
。 这些在语法上更容易检测。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.