使用sizeof运算符可以很好地定义此代码吗?

dhe*_*ein 9 c arrays sizeof

#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如果您想知道如何将数组作为指针参数传递,那是因为隐式的数组到指针转换,称为数组衰减.

  • 实际上,可以将带有`test(sizeof(arr),&arr)`的数组传递给一个带有签名`void test(size_t n,int(*arraryPtr)[n])`的函数,然后可以查询`sizeof(*arrayPtr)`的数组大小. (2认同)

Zie*_*ezi 6

这是:

void test(int arr[]) {
    printf("%d\r\n", sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)

有效?

它不是有效的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得到指针类型的大小.