C++自定义数组最大索引查找函数运行结果不符合预期
问题原因
C/C++ 中数组作为形参传入函数时,会自动退化为指向数组首元素的指针,此时函数内部对形参array执行sizeof运算,得到的不是整个数组的总字节数,而是指针变量本身占用的字节数。
以64位环境为例:
- 指针类型占8字节,
double类型单个元素占8字节,因此函数内arraySize = sizeof(array)/sizeof(array[0])的计算结果为8/8=1 - 循环仅会执行
i=0的单次判断,maxIndex始终保持初始值0,最终返回结果为0
而把逻辑直接写在main函数中时,array是当前作用域内定义的完整数组类型,sizeof(array)可以正确获取整个数组的总字节长度:10个double元素共占80字节,计算得到的arraySize为10,循环可以遍历所有元素,因此能得到正确结果。
修复方法
不要在函数内部通过sizeof计算传入数组的长度,两种常用实现方案:
- 传数组时额外把数组长度作为独立参数传入函数
- C++环境下优先使用
std::vector、std::array等标准容器,这类容器不会出现指针退化问题,可以通过内置方法直接获取容器长度
修正后的可运行代码:
#include <iostream> using namespace std; int findMaxIndex(double array[], int arraySize) { int maxIndex = 0; for (int i = 1; i < arraySize; i++) { if (array[maxIndex] < array[i]) { maxIndex = i; } } return maxIndex; } int main() { double array[10] = {11.20,22.2,33.3,43.4,55.5,66.6,77.7,88.8,90.0,100}; int arraySize = sizeof(array)/sizeof(array[0]); cout << findMaxIndex(array, arraySize) << endl; return 0; }
内容的提问来源于stack exchange,提问作者Daniel Choi
相关产品推荐
相关产品推荐

