C++中打印数组后输出换行符出现非预期结果是什么原因?
问题根因
你的代码触发了C++的未定义行为,核心错误出在sum函数的循环变量定义逻辑上:
for (int i; i < n; i++) {
这里你声明了局部变量i但没有显式赋初始值。C++中栈上分配的局部非静态变量不会被自动初始化,它的初始值完全取决于当前栈内存区域之前遗留的随机数据。
你观察到的“加换行打印就出错、删了就正常”只是巧合:
- 保留换行打印语句时,IO操作、函数调用过程会修改栈内存的遗留数据,刚好让
i的初始值不为0,循环从随机偏移量开始执行,自然得到错误的求和结果,严重时还可能触发数组越界访问崩溃。 - 删除换行打印语句时,栈内存的遗留值刚好让
i的初始值为0,循环能正常遍历完整的5个数组元素,因此得到正确结果,但这种稳定是暂时的,只要运行环境、编译参数稍有变化就会再次出错。
修复方案
给sum函数的循环变量i显式添加初始值0即可:
int sum(int arr[], int n) { cout << arr << "\n"; int total = 0; for (int i = 0; i < n; i++) { total += arr[i]; } return total; }
修复后无论是否保留那行换行打印语句,程序都会稳定输出正确结果。
内容的提问来源于stack exchange,提问作者Abishek
相关产品推荐
相关产品推荐

