整数排序算法出现随机值:负数变为0且无报错(Windows GCC)
问题分析与修复
你的排序代码出现负数变为0的问题,核心原因是数组越界访问引发的未定义行为:
在while循环中,你仅通过intergers[c] > intergers[c-1]判断是否终止,未限制c的最小值。当处理最左侧的负数元素时,c会被不断递减到0,此时继续执行intergers[c-1]等价于访问intergers[-1]——这是数组边界外的内存区域,读写该区域会破坏原有数据或读取垃圾值,最终导致原负数被错误覆盖为0。
修复后的代码
#include <stdio.h> int main() { int intergers[] = {4, 5, 1, -6, -7}; int length = sizeof(intergers) / sizeof(intergers[0]); int c; int i1; int i2; for (int cursor = 1; cursor < length; ++cursor) { c = cursor; // 添加c > 0的条件,避免越界访问 while (c > 0) { if(intergers[c] > intergers[c-1]) { break; } i1 = intergers[c]; i2 = intergers[c-1]; intergers[c] = i2; intergers[c-1] = i1; --c; } } for (int cursor = 0; cursor < length; ++cursor) { printf("%i ", intergers[cursor]); } }
修复说明
将原while(true)替换为while(c > 0),确保只有当c大于0时才执行循环内的比较和交换操作,彻底避免访问数组下标为-1的非法内存区域。修复后运行输出会变为正确的升序结果:-7 -6 1 4 5。
内容的提问来源于stack exchange,提问作者J3hud
相关产品推荐
相关产品推荐

