sizeof()如何通过引用参数传递

时间:2014-03-07 10:17:53

标签: c arrays function pointers

我传递了一个数组来运行,并试图找到数组的长度。但结果没有预料到。有人可以解释一下吗?

int main()
{
     int array[10]={0};
     func(array);
     return 0;
}
void func(int arr[])
{
    printf("length of an array is %d ",(sizeof(arr)/sizeof(arr[0]));
}

它给出答案2。 当我在main函数中尝试相同的操作时,它工作正常(答案是10)。 //在linux中使用gcc complier

6 个答案:

答案 0 :(得分:3)

我觉得结果是因为sizeof(arr) == 8(PC上指针的大小)和sizeof(arr[0]) == 4造成的,因为它是一个整数8/4==2

此声明:void func(int arr[])告诉函数将指向int 的指针作为参数。

我不清楚是否可以通过引用计算sizeof数组。 C函数接受数组引用作为参数总是倾向于接收它们的长度作为参数。

main()函数的区别在于main array内部变量的类型为int[10],因此sizeof能够以字节为单位获取其长度。在func中,arr的类型为int*,因此sizeof仅为您提供指针的字节长度。

答案 1 :(得分:2)

您正在发送和接收阵列pionter,而不是阵列。

发送arg ::

func(array[10]);

接收arg:

void func(int array[10])

但发送整个阵列并不好。所以发送和接收如下的参数。

func(array, arry_size);  //function call
void func(int array[], int length)  //defin

答案 2 :(得分:1)

你必须记住数组衰减到指针。这意味着在函数func中,变量arr实际上不是数组而是指针。在指针上执行sizeof会返回指针的大小而不是指向的大小。

你得到结果2,因为你在一个64位系统上,指针是64位(即8个字节),一个除以int的大小(4个字节) )你得到结果2

答案 3 :(得分:0)

sizeof(arr)

是指针的大小,而不是块arr指向的大小。

答案 4 :(得分:0)

当您将数组作为参数传递给函数时,该数组会衰减为指向数组开头的指针。与数组不同,指针中没有存储元信息。一个好的做法是将大小作为附加参数传递给函数。

void func(int *arr, int size);

这是C标准所说的(C99 6.3.2.1/3 - 其他操作数 - 左值,数组和函数指示符):

  

除非它是sizeof运算符或一元&的操作数。运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,不是左值

所以,一旦你把它传递给函数 - 在函数内部,它不再是一个数组,它是一个指针。

答案 5 :(得分:-1)

sizeof()运算符返回数据类型的大小。这里int size是两个。