C语言实现bubble sort输出异常多出0值的问题咨询
异常原因
代码里存在两处数组越界访问的未定义行为,你看到的前置0值就是越界读写非法内存导致的:
- 冒泡排序的内层循环存在越界读写:你通过
malloc申请的数组长度为size,合法访问下标范围是0到size-1,但内层循环写的是for (int j = 0; j < size; ++j),当j = size - 1时,代码会访问arr[j+1]也就是下标为size的未申请内存。你本次运行时这个内存位置恰好存储了0值,排序过程中这个0被当成数组元素参与比较交换,一路被换到了数组最前端。 - 输出数组的循环也存在越界:输出循环条件写的是
for (int i = 0; i <= size; ++i),会多访问1个非法内存位置,最终把排序时被换到前端的0、以及排序后的1、2、3全部打印出来,就得到了你看到的0 1 2 3结果。
这类越界访问属于C语言的未定义行为,本次运行只是恰好读出了0值,更换编译选项、运行环境都可能出现随机乱码、程序崩溃等更严重的问题。
另外你写的else if (arr[j] == arr[j+1]) { continue; }是完全冗余的逻辑,即使删掉也不会影响排序结果,没有保留必要。
修复方案
- 修改冒泡排序内层循环的边界条件,将
j < size改为j < size - 1 - i:既避免了arr[j+1]的越界访问,也利用了冒泡排序每轮都会把当前未排序区间的最大值移到末尾的特性,减少不必要的比较,提升执行效率。 - 修改输出循环的边界条件,将
i <= size改为i < size,仅遍历数组合法下标区间。 - 删除冗余的相等判断continue逻辑即可,另外建议用完
malloc申请的内存后手动释放,避免内存泄漏。
修复后的完整代码如下:
#include <stdio.h> #include <stdlib.h> void bubble_sort(int size, int *arr); int main(void) { int *array, size; printf("enter the amount of data: "); scanf("%d", &size); array = (int*)malloc(sizeof(int) * size); for (int i = 0; i < size; ++i) { scanf("%d", &array[i]); } bubble_sort(size, array); for (int i = 0; i < size; ++i) { printf("%d ", array[i]); } printf("\n"); free(array); return 0; } void bubble_sort(int size, int *arr) { for (int i = 0; i < size; ++i) { for (int j = 0; j < size - 1 - i; ++j) { if (arr[j] > arr[j + 1]) { int temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
修复后再运行,输入3个值3、1、2,就会正确输出1 2 3,不会再出现额外的异常值。
内容的提问来源于stack exchange,提问作者user19102267
相关产品推荐
相关产品推荐

