我理解为什么数组在传递给函数时会衰减到指针而不指定其大小,例如:
void test(int array[]);
为什么在传递大小时会这样做?例如
void test(int array[3]);
我在后一个函数签名下遇到sizeof
时出现问题,这很令人沮丧,因为在编译时可以清楚地知道数组长度。
答案 0 :(得分:3)
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.
没有神奇的解决方案,处理问题最可读的方法是使用数组+大小生成struct
,或者只是将大小作为附加参数传递给函数。
LE:请注意,此转换仅适用于数组的第一个维度。传递给函数时,int[3][3]
会转换为int (*)[3]
,而非int **
。
答案 1 :(得分:1)
因为您无法正确调用此类功能。在几乎所有上下文中,数组衰减到指向第一个元素的指针,并且在任何尝试调用该函数时,数组将首先转换为指针并且调用将是不匹配的。数组不衰减的唯一上下文是运算符sizeof
,_Alignof
,_Alignas
和&
。这些在语法上更容易检测。