C 为什么sizeof函数获取数组长度在我的函数中不起作用?
此处新增:)C 为什么sizeof函数获取数组长度在我的函数中不起作用?,c,C,此处新增:) 双平均值(int-arr[]{ int-total=0; int i; 整数计数=0; 双平均值; int len=sizeof arr/sizeof arr[0]; printf(“%i\n”,len); 对于(i=0;i而言,问题在于您已将数组作为参数传递给函数。当您传递数组时,编译器会将其“衰减”到指向第一个元素的指针。这意味着无法从函数内部判断数组中有多少个元素 然后,用于计算数组大小的表达式是指针大小除以整数大小。结果是2,因为在许多现代平台上,整数是32位,指针是64位
双平均值(int-arr[]{
int-total=0;
int i;
整数计数=0;
双平均值;
int len=sizeof arr/sizeof arr[0];
printf(“%i\n”,len);
对于(i=0;i而言,问题在于您已将数组作为参数传递给函数。当您传递数组时,编译器会将其“衰减”到指向第一个元素的指针。这意味着无法从函数内部判断数组中有多少个元素
然后,用于计算数组大小的表达式是指针大小除以整数大小。结果是2,因为在许多现代平台上,整数是32位,指针是64位。当您进入average
函数时,arr
已经衰减为指针,因此,您不能使用sizeof
获取数组的长度。相反,您应该将大小作为第二个参数传递给函数
至于为什么会得到2
,您可能有:
sizeof int* => 8
sizeof int => 4
当您在函数参数中使用int arr[]
时,您将数组作为指针传递。指针的大小为8字节(因为它们只保存内存块的地址)。因此,您实际要做的是取sizeof(int*)/sizeof(int)
,等于8/4==2
。您需要做的是传递数组的长度:
double average(int *arr, int len) {
int total = 0;
int i;
int count = 0;
double avg;
printf("%i\n", len);
for (i=0; i<len; i++)
{
total += arr[i];
count += 1;
}
avg = (double) total / count ;
return avg; }
int main() {
int array1[5] = {150, 20, 20, 40, 190};
printf("%f", average(array1, 5));
双平均值(int*arr,int len){
int-total=0;
int i;
整数计数=0;
双平均值;
printf(“%i\n”,len);
对于(i=0;iarr[]
参数,它是对int
的引用,大小是8。因为你得到的是指向第一个地址的指针。当你像arr[1]
那样访问时,你正在做的是*arr+sizeof(int)
。第一个元素大小是4,所以..2BTW:sizeof
是一个运算符,而不是一个函数
double average(int *arr, int len) {
int total = 0;
int i;
int count = 0;
double avg;
printf("%i\n", len);
for (i=0; i<len; i++)
{
total += arr[i];
count += 1;
}
avg = (double) total / count ;
return avg; }
int main() {
int array1[5] = {150, 20, 20, 40, 190};
printf("%f", average(array1, 5));