#include <stdio.h>
void test(int arr[]);
int main ()
{
int *arr[3];
int ar1[2] = { 1, 2 };
int ar2[3] = { 3, 4, 5 };
int vla[ar2[1]];
arr[0] = ar1;
arr[1] = ar2;
arr[2] = vla;
for (int i = 0; i < 3; i++)
{
test(arr[i]);
}
}
void test(int arr[])
{
printf("%zu\r\n", sizeof(arr));
}
正如标题所说:这有效吗?如果有的话,有没有办法让test()
输出不同的值,使用sizeof
函数参数传递给数组?
答案 0 :(得分:23)
是的,它是有效的,并且会给出int
指针的大小(这是arr
参数的类型,C中没有数组参数),以字节为单位。 1
要使用sizeof
以字节为单位获取数组的大小,参数必须是实际数组,而不是指针。
因此,如果不传递指定大小的额外参数,就不可能将数组的大小作为参数传递给函数。
所以,
有没有办法让
test()
输出不同的值,使用sizeof on function参数交给像数组一样?
没有。 (不编辑功能体。)
1 如果您想知道如何将数组作为指针参数传递,那是因为隐式数组到指针的转换,称为array decaying。
答案 1 :(得分:6)
这是:
void test(int arr[]) { printf("%d\r\n", sizeof(arr)); }
有效?
它不是有效的 1 代码,但它等同于:sizeof(int*)
,而不是数组的大小arr
,因为当您将数组作为参数衰减到指针 2 ,即它会丢失有关整个数组大小的信息。将此信息传递到函数中的唯一方法是通过另外的第二个参数。
有没有办法让
test()
输出不同的值,使用sizeof
函数参数输入就像数组一样?
如果要打印要传递的数组的大小,可以使用类似:sizeof(array)
的函数作为函数的第二个参数,其中函数签名为:
void test(int arr[], size_t size);
你可以插入上面作为第二个参数并获得第一个参数的大小。
1。 size_t
(返回类型sizeof()
)和int
(与"%d"
中的说明符printf(),
匹配的预期类型之间存在类型不匹配,导致未定义的行为。
2。函数外部的arr[]
将整个数组表示为一个对象,这就是为什么如果应用sizeof()
,你将获得整个数组的大小,但是,当作为参数传递时,arr
会衰减指向数组的第一个元素的指针,如果你应用sizeof()
,你将获得指针类型的大小。
答案 2 :(得分:4)
使用sizeof运算符来定义这段代码吗?
迂腐:没有
[10,20,30]
会返回sizeof()
类型。 size_t
期望类型"%d"
。使用不匹配类型会导致未定义的行为(UB)。第1步:使用匹配的说明符
int
以下打印指针// printf("%d\r\n", sizeof(arr));
printf("%zu\r\n", sizeof(arr));
// or
printf("%d\r\n", (int) sizeof(arr));
的大小。 arr
中的代码无关紧要。
main()