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
解决方法
如果一定要在子函数中使用传入数组的长度, 请在主函数中计算正确后, 传入子函数进行使用