#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));
}
Run Code Online (Sandbox Code Playgroud)
正如标题所说:这是有效的吗?如果是这样,有没有办法test()
通过使用sizeof
像数组一样输入的函数参数来输出不同的值?
eml*_*lai 23
是的它是有效的,并且将以字节为单位给出int
指针的大小(这是arr
参数的类型,C中没有数组参数).1
要获取以字节为单位的数组大小sizeof
,参数必须是实际数组,而不是指针.
因此,在不传递指定大小的额外参数的情况下,不可能将作为参数传递的数组的大小传递给函数.
所以,
有没有办法
test()
通过使用sizeof函数参数输出不同的值,就像在数组上一样?
没有.(不编辑功能体.)
1如果您想知道如何将数组作为指针参数传递,那是因为隐式的数组到指针转换,称为数组衰减.
这是:
Run Code Online (Sandbox Code Playgroud)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);
Run Code Online (Sandbox Code Playgroud)
你可以插入上面作为第二个参数,并获得第一个参数的大小.
1.之间有一个类型不匹配size_t
(返回类型的sizeof()
)和int
(所期望的类型相匹配的说明符"%d"
在printf(),
,这导致未定义的行为.
2. arr[]
函数外部将整个数组表示为一个对象,这就是为什么如果你应用sizeof()
你将获得整个数组的大小,但是,当作为参数传递时,arr
衰减到数组的第一个元素的指针,如果你应用sizeof()
你'll得到指针类型的大小.