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;i
arr[]
参数,它是对
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));