c中自定义函数通过sizeof来输出数组的长度为何不正确?【已解决】

#include <stdio.h>  
 
//输出数组的长度 
int arr_length(double a[]) {
    int len=sizeof(a)/sizeof(a[0]);  //1  ??????为何输出1呢   为何不是数组的长度 
    return len;
}
 
int main(){
    double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80};
    printf("arr_length里面的数组长度为%d\n",arr_length(arr));
    int length = sizeof(arr)/sizeof(arr[0]);
    printf("main里面的数组长度为%d\n",length);   //正常输出, 10
    return 0;
}

结果输出:

clipboard.png

个人用的编辑器是dev-c++,64位操作系统。
请问如何操作才能使arr_length里面可以正常输出数组的长度?

阅读 6.9k
3 个回答

数组做为参数的时候就退化成了指针了
sizeof 算出来的是指针的大小,不是你想的数组的大小
一般在C里面的用法是将数组的长度传递进去,这需要一个额外的参数
C++可以用vector等容器避免大部分数组的操作,对于字符数组也有string可以替代,也有可以传递数组大小的奇迹淫巧

template <size_t N>
long calc(long (&array)[N]) // 利用模板传递参数 array是数组的引用
{
    long res = 0L;
    
    for (size_t i = 0;i < N;i ++) {
        res += array[i];
    }
    
    return res;
}

int main()
{
    long longarr[] = {1, 23, 4, 45, 46, 57,};
    
    long sum = calc(longarr);
}

数组一旦作为参数传递 退化为指针,就不知道原来长度了。。。
如果你需要计算数组长度的函数,可以使用宏定义 或者 如果是C++,也用相应的模板技巧,这比宏定义安全

你在将 arr 传入 arr_length 函数的时候,传入的就是 arr 的指针,并不是 arr 本身,用来计算的也是指针的长度,并不是数组的长度。

你这个目的,用个宏就能简单实现了,不一定要用函数

#define ARR_LENGTH(arr)    sizeof(arr)/sizeof(arr[0])

函数内的sizeof做不到

根本原因是sizeof在编译期求值, 而double a[]这个函数参数的长度在编译期不确定 (arr[]是确定的)

你需要#define (不是函数), 或者另开一个参数用来在运行时传递长度.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进