C语言选择排序程序仅约十分之一概率运行正常该如何排查
核心Bug定位
问题出在getMinPos函数的初始化逻辑:
- 原代码将存储最小元素下标的变量
max错误初始化为数组元素值argv[startPos],而非对应的下标startPos - 后续代码直接用这个元素值作为下标访问数组
argv[max],当数组元素值远大于数组长度(比如测试用例中的3421)时,会触发数组越界访问,属于C语言未定义行为,直接导致程序运行不稳定、随机崩溃。
异常现象说明
- 程序随机返回错误值
-1073741819:该值对应Windows系统的内存访问违规错误码0xC0000005,是数组越界访问的典型报错 - 开头的
printf无输出:默认标准输出stdout为行缓冲,程序崩溃时缓冲区内的内容还没来得及刷新到终端就被系统回收,所以看不到打印内容。
修复方案
只需要修改getMinPos函数的初始化语句即可:
int getMinPos(int *argv, int argc, int startPos) { // 原错误写法:int max = argv[startPos]; int max = startPos; // 修复为存储下标而非元素值 for (int i = startPos; i < argc; i++) { if (argv[i] < argv[max]) { max = i; } } return max; }
修复后程序即可正常完成选择排序逻辑,稳定输出排序结果。
内容的提问来源于stack exchange,提问作者Luqus
相关产品推荐
相关产品推荐

