数组相邻元素求和异常排查:C++代码输出失控问题求助
问题分析与修复方案
看起来你的代码里有几个关键问题导致了输出异常,我们一步步来拆解:
1. 数组越界(直接引发奇怪输出的核心原因)
你的代码存在两处严重的数组越界访问:
- 处理第一个元素(
i == 0)时,你写了Bush[total],但数组索引范围是0到total-1,total明显超出边界,会读取内存中的随机垃圾值。 - 当
i == 0时,后续代码还会执行output = Bush[i] + Bush[i + 1] + Bush[i - 1];,这里i-1等于-1,同样是越界访问未知内存,这就是测试{1,2,3}时得到诡异数字7208681的根本原因。 - 两个
if判断没有用else分隔,当数组长度特殊时(比如total=1),会触发逻辑冲突。
2. 非标准的可变长度数组(VLA)
C++标准并不支持int Bush[total];这种运行时确定长度的数组,虽然部分编译器(如GCC)提供了扩展支持,但会导致代码可移植性问题,建议改用标准的std::vector存储动态长度数组。
3. 逻辑实现混乱
从代码里temp和output的赋值逻辑来看,你似乎想找出所有元素相邻和的最大值,但逻辑完全错误:循环中反复覆盖output的值,既没有正确计算每个元素的和,也没有正确维护最大值。
修复后的代码(找最大值版本)
根据你的需求(首尾循环计算相邻和,同时找出最大值),下面是符合标准且逻辑正确的代码:
#include <iostream> #include <vector> using namespace std; int main() { int total; cin >> total; // 使用vector替代可变长度数组,符合C++标准 vector<int> Bush(total); for (int i = 0; i < total; ++i) { cin >> Bush[i]; } // 初始化最大值:先计算第一个元素的和 int max_sum = Bush[0] + Bush[1] + Bush[total - 1]; // 计算中间元素的和,并更新最大值 for (int i = 1; i < total - 1; ++i) { int current_sum = Bush[i] + Bush[i-1] + Bush[i+1]; if (current_sum > max_sum) { max_sum = current_sum; } } // 计算最后一个元素的和,并更新最大值 int last_sum = Bush[total - 1] + Bush[total - 2] + Bush[0]; if (last_sum > max_sum) { max_sum = last_sum; } cout << max_sum << endl; return 0; }
代码说明
- 用
std::vector存储数组,避免了非标准特性的兼容性问题。 - 分三部分处理元素,每个部分都正确维护了邻居索引:
- 第一个元素的前邻居是数组最后一个元素
Bush[total-1],后邻居是Bush[1]。 - 最后一个元素的前邻居是
Bush[total-2],后邻居是数组第一个元素Bush[0]。 - 中间元素直接用
i-1和i+1即可。
- 第一个元素的前邻居是数组最后一个元素
- 正确维护最大值
max_sum,每次计算当前元素的和后,与当前最大值比较并更新。
测试示例:
- 数组
{1,2,3}:每个元素的和都是6,输出6。 - 数组
{1,2,3,4}:第三个元素的和是9,所有元素的和分别为7、6、9、8,最大值为9,输出正确。
若需输出每个元素的和(而非最大值)
如果你的需求是打印每个元素的相邻和,可使用以下代码:
#include <iostream> #include <vector> using namespace std; int main() { int total; cin >> total; vector<int> Bush(total); for (int i = 0; i < total; ++i) { cin >> Bush[i]; } for (int i = 0; i < total; ++i) { // 三元运算符处理首尾元素的邻居 int prev = (i == 0) ? Bush[total - 1] : Bush[i - 1]; int next = (i == total - 1) ? Bush[0] : Bush[i + 1]; int current_sum = Bush[i] + prev + next; cout << "第" << i+1 << "个元素的和:" << current_sum << endl; } return 0; }
测试{1,2,3}时会输出三个6,测试{1,2,3,4}时会依次输出7、6、9、8,完全符合需求。
内容的提问来源于stack exchange,提问作者Пламен Цанев
相关产品推荐
相关产品推荐

