为什么C数组在传递大小时会衰减到指针

时间:2017-10-08 08:21:35

标签: c arrays

我理解为什么数组在传递给函数时会衰减到指针而不指定其大小,例如:

void test(int array[]);

为什么在传递大小时会这样做?例如

void test(int array[3]);

我在后一个函数签名下遇到sizeof时出现问题,这很令人沮丧,因为在编译时可以清楚地知道数组长度。

2 个答案:

答案 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&。这些在语法上更容易检测。