C/C++在子函数中计算作为参数传入的数组的长度问题

在C/C++函数中计算传入的数组的长度是不可取的


问题

在C/C++函数中计算传入的数组的长度是不可取的


错误示范1

#include <iostream>

// 计算数组长度
int cal_array_length(int array[]);

int main()
{
    int array[] = {1, 2, 3, 4};
    int len = cal_array_length(array);
    std::cout << "The length of array is " << len << std::endl;
    return 0;
}

// 思路:遍历array的内容, 若为空则说明遍历完成, 记录下遍历的长度即为array长度
int cal_array_length(int array[])
{
    int len = 0;
    while (*(array+len))
    {
        std::cout << *(array + len) << "\n";
        len++;
    }
    return len;
}

运行结果:

# 成功打印出了原数组和另外几个被随机初始化的值, 错误!
1
2
3
4
-422738416
32764
-2062849280
1138462531
The length of array is 8

错误示范2

#include <iostream>

// 计算数组长度
int cal_array_length(int array[]);

int main()
{
    int array[] = {1, 2, 3, 4};
    int len = cal_array_length(array);
    std::cout << "The length of array is " << len << std::endl;
    return 0;
}

// 思路:遍历array, 直至找到空指针, 记录长度即为数组长度
int cal_array_length(int array[])
{
    int len = 0;
    while (array+len) len++;
    return len;
}

运行结果:

# 没有结果, 无法跳出while循环

错误示范3

#include <iostream>

// 计算数组长度
int cal_array_length(int array[]);

int main()
{
    int array[] = {1, 2, 3, 4};
    std::cout << "In Func main, length of array = " << sizeof(array)/sizeof(array[0]) << "\n";
    int len = cal_array_length(array);
    std::cout << "In subfunction, length of array = " << len << "\n";
    return 0;
}

// 思路:就像在主函数中一样, 用总占用内存÷单个元素占用内存即可得到元素个数
int cal_array_length(int array[])
{   
    return sizeof(array)/sizeof(array[0]);
}

运行结果:

# 编译器首先会报warning
warning: ‘sizeof’ on array function parameter ‘array’ will return size of ‘int*’

意味着sizeof(array)并不能像主函数中一样得到数组的总占用内存, 而是把array认为是一个int型的指针, 从而计算了int型指针的size

看一下结果:

In Func main, length of array = 4 # 计算正确
In subfunction, length of array = 2 # sizeof(array) = sizeof(int*) = 8, sizeof(int) = 4, 8/4 = 2

解决方法

如果一定要在子函数中使用传入数组的长度, 请在主函数中计算正确后, 传入子函数进行使用

posted @ 2022-06-26 17:00  EvanZone  阅读(283)  评论(0编辑  收藏  举报