C++递归求数组元素和 接收用户输入时输出错误原因排查
C++递归数组求和交互运行结果异常问题
复现代码
#include<iostream> using namespace std; int getSum(int *arr, int size) { if(size == 0) { return 0; } if(size == 1 ) { return arr[0]; } int remainingPart = getSum(arr+1, size-1); int sum = arr[0] + remainingPart; return sum; } int main() { int arr[100], n; cin >> n; for(int i = 0; i < n; i++){ cin >> arr[n]; } int sum = getSum(arr, n); cout << "Sum is " << sum << endl; return 0; }
异常运行输出
3 1 2 3 Sum is -1827678256
问题根因
错误出在数组输入环节的下标使用上,和递归求和逻辑本身没有关系:
- 输入循环的遍历变量是
i,但接收输入值时写入的数组位置固定为arr[n],全程没有用到i做下标。 - 这意味着你输入的n个数字,全部被覆盖写到了数组下标为n的同一个位置,参与求和计算的
arr[0]到arr[n-1]这n个元素,从来没有被赋值,存储的是栈内存上的随机垃圾值。 - 递归求和时累加的全是这些未初始化的垃圾值,自然会算出不符合预期的负数结果。
- 固定输入能得到正确结果,是因为固定赋值的逻辑直接给
arr[0]到arr[n-1]赋了确定值,绕过了这个有bug的输入流程,所以没有触发异常。
修复方案
只需要修改输入循环的数组下标,把固定的n换成遍历变量i即可:
for(int i = 0; i < n; i++){ cin >> arr[i]; }
修改后输入的数值会按顺序存入数组对应位置,递归求和就能返回正确结果。
内容的提问来源于stack exchange,提问作者Nayan Prasad P K
相关产品推荐
相关产品推荐

