这段代码是否使用 sizeof 运算符定义得很好?

Is this code well defined by using sizeof operator?

#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));
}

如标题所说:有效吗?如果是这样,有没有办法通过在函数参数上使用 sizeof 来使 test() 输出不同的值,就像在数组上一样?

是的,它是有效的,并且会以字节为单位给出 int 指针的大小(这就是 arr 参数的类型,C 中没有数组参数)。 1

要使用 sizeof 获取数组的大小(以字节为单位),参数必须是实际数组,而不是指针。

因此,如果不传递指定大小的额外参数,则无法获取作为函数内部参数传递的数组的大小。

所以,

is there a way to make test() output different values by using sizeof on function argument handed in like on array?

没有。 (不编辑函数体。)

1 如果您想知道如何将数组作为指针参数传递,那是因为隐式 array-to-pointer 转换,称为 array decaying.

Is this:

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

valid?

它不是有效的1 代码,但它等效于:sizeof(int*),不是数组的大小,arr,因为你将数组作为参数传递,它 衰减到指针 2 即它丢失了有关整个数组大小的信息。将此信息传递到函数中的唯一方法是通过附加的第二个参数。

Is there a way to make test() output different values by using sizeof on function argument handed in like on array?

如果你想打印你传递的数组的大小,你可以使用类似的东西:sizeof(array)作为函数的第二个参数,函数签名是:

void test(int arr[], size_t size); 

您可以将上面的内容作为第二个参数插入并获取第一个参数的大小。


1. size_tsizeof() 的返回类型)和 int(与 printf(), 中的说明符 "%d" 匹配的预期类型之间存在类型不匹配,这导致到未定义的行为。

2。 arr[] 在函数外部将整个数组表示为一个对象,这就是为什么如果你应用 sizeof() 你将获得整个数组的大小,但是,当作为参数传递时,arr 衰减到数组第一个元素的指针,如果你应用 sizeof() 你会得到指针类型的大小。

Is this code well defined by using sizeof operator?

迂腐地:没有

sizeof() returns 输入 size_t"%d" 需要类型 int。使用 mis-match 类型会导致未定义的行为 (UB)。第 1 步:使用匹配说明符

// printf("%d\r\n", sizeof(arr));
printf("%zu\r\n", sizeof(arr));
// or
printf("%d\r\n", (int) sizeof(arr));

下面打印指针的大小arrmain() 中的代码不相关。

void test(int arr[]) {
  printf("%zu\r\n", sizeof(arr));
}

// or simply: remove (), \r of dubious value
  printf("%zu\n", sizeof arr);