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

来源:互联网  时间:2016/5/14 15:57:34

关于网友提出的“c中自定义函数通过sizeof来输出数组的长度为何不正确?”问题疑问,本网通过在网上对“c中自定义函数通过sizeof来输出数组的长度为何不正确?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:c中自定义函数通过sizeof来输出数组的长度为何不正确?
描述:

#include   

//输出数组的长度 
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;
}

结果输出:

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


解决方案1:

函数内的sizeof做不到

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

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

解决方案2:

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

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

#define ARR_LENGTH(arr)    sizeof(arr)/sizeof(arr[0])
解决方案3:

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

template 
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++,也用相应的模板技巧,这比宏定义安全

上一篇(shell)MacOS用iTerm连接到Linux上,不能输入中文
下一篇python的列表字符串如何转换为php数组
明星图片
相关文章
《c中自定义函数通过sizeof来输出数组的长度为何不正确?》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)