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

时间:2016-01-13 16:46:04

标签: 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));
}

正如标题所说:这有效吗?如果有的话,有没有办法让test()输出不同的值,使用sizeof函数参数传递给数组?

3 个答案:

答案 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()