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

发布于 2022-09-02 00:32:42 字数 660 浏览 14 评论 0

#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里面可以正常输出数组的长度?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱她像谁 2022-09-09 00:32:42

数组做为参数的时候就退化成了指针了
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++,也用相应的模板技巧,这比宏定义安全

暗地喜欢 2022-09-09 00:32:42

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

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

#define ARR_LENGTH(arr)    sizeof(arr)/sizeof(arr[0])
梦断已成空 2022-09-09 00:32:42

函数内的sizeof做不到

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文