为什么C++代码添加无逻辑作用的自增整数后运行输出结果异常
问题根因
你的代码本身存在未定义行为(UB),添加变量后运行结果变化是未定义行为的典型表现,核心问题出在全局数组nums的定义上:
- 你定义了
int nums[] = {};,这是C++标准不支持的零长度数组(属于部分编译器的扩展语法),数组实际可用空间为0。 - 在
rq2函数中你向nums[n2]写入用户输入的4个值,属于严重的数组越界访问,写入的内容会直接覆盖数组后方内存区域存储的其他数据。
全局变量存储在静态存储区,按照你声明的顺序排布:i → j → nums(零长度,无实际占用空间) → co。你向nums写入的元素会直接覆盖co、甚至更后方内存的值:
- 原代码中
co没有被任何逻辑读取,就算被越界写入覆盖了值,也不会影响运行结果,所以看起来符合预期。 - 你添加
co++操作后,co的值会参与运算,此时co的内存已经被nums的越界写入篡改,会触发后续逻辑的异常:你代码的sort函数中存在return分支,被篡改的co或其他被越界覆盖的变量值会导致逻辑提前触发return,只输出一行结果就退出。
修复方案
不要使用零长度数组,改为动态分配数组空间:
- 删掉全局的
int nums[] = {};定义 - 在
rq1获取到输入的i之后,再创建对应长度的数组,推荐使用标准容器std::vector:
#include <vector> std::vector<int> nums; void rq1() { std::cout << "How many numbers?"; std::cin >> i; nums.resize(i); // 调整vector长度为输入的i }
修改后数组不会再越界,添加co++也不会影响运行逻辑。
内容的提问来源于stack exchange,提问作者Ball
相关产品推荐
相关产品推荐

