我传递了一个数组来运行,并试图找到数组的长度。但结果没有预料到。有人可以解释一下吗?
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
答案 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是两个。