为何本地Dev-C++与在线编译器运行C++排序程序结果不一致?
C++数组排序程序输出不一致问题分析与修复
问题现象
在Dev-C++ 6.30(搭配TDM-GCC 9.2.0编译器)本地编译运行排序代码时,输出非预期结果:2 4 5 9 23 69
而在Programiz在线编译器运行同一代码,得到预期输出:2 4 5 9 23 88
核心问题:数组越界访问
代码中的冒泡排序内层循环存在数组越界问题:
for(i=0; i<6; i++) { if ( Arr[i] > Arr[i+1]) { // 交换操作 } }
数组Arr的大小为6,合法下标范围是0~5。当i=5时,Arr[i+1]等价于Arr[6],这属于访问数组边界外的内存,触发未定义行为——不同编译环境对越界内存的处理逻辑不同,导致输出结果不一致:本地环境中越界访问的内存值覆盖了原数组中的88,而在线环境未出现此问题。
修复方案
修改内层循环的终止条件,确保i+1不超过数组最大下标5,同时可以优化冒泡排序,每轮循环只遍历到未排序的部分(减少不必要的比较):
#include <iostream> using namespace std; int main() { int i, cnt, x; int Arr[6] = {2, 9, 23, 88, 5, 4}; // 优化后的冒泡排序:每轮减少末尾已排序的元素数量 for (cnt = 1; cnt < 6; cnt++) { // i的范围改为0到5-cnt,避免越界且跳过已排序的末尾元素 for(i=0; i < 6 - cnt; i++) { if ( Arr[i] > Arr[i+1]) { x = Arr[i]; Arr[i] = Arr[i+1]; Arr[i+1] = x; } } } // 打印排序后的数组 for (int j=0; j<6; j++) cout << Arr[j] << "\t"; }
修复后验证
修改后无论在本地Dev-C++还是在线编译器运行,都会得到预期输出:2 4 5 9 23 88
内容的提问来源于stack exchange,提问作者Mahmood Raza
相关产品推荐
相关产品推荐

