首页 > 解决方案 > 不确定为什么冒泡排序代码有分段错误

问题描述

嗨,我正在使用 gdb 调试我的冒泡排序代码,但我不明白为什么它一直在中断if(a[j] < a[j-1]

这是我的冒泡排序功能

void sort(int a[], int n) {
    int i, j, nswaps, tmp;
    for(i = 0; i < n; i++) {
       nswaps = 0;
       for(j = 0; j > i; j++) {
           if(a[j] < a[j-1]) {
               tmp = a[j];
               a[j] = a[j-1];
               a[j-1] = tmp;
               nswaps++;
            }
       }
       if(nswaps == 0) break;
    }
}

请帮帮我谢谢!!

更新的代码:仍然有分段错误

void sort(int a[], int n) {
int i, j, nswaps;
for (i = 0; i < n; i++) {
    nswaps = 0;
    for (j = 1; j > i; j++) {
        if (a[j] < a[j-1]) {
            int tmp;
            tmp = a[j];
            a[j] = a[j-1];
            a[j-1] = tmp;
            nswaps++;
        }
    }
    if (nswaps == 0) break;
 }

}

标签: c

解决方案


在外循环的第一次迭代中(当 的值为i0 时),内循环变为无限循环,因为 的值j从 0 开始并不断增加。最终j变得足够大,您的程序可以访问一些未分配的内存,从而导致分段错误。

此外,在内部循环的第一次迭代中,值为j0,因此a[j - 1]将尝试访问超出程序范围的内存位置。


推荐阅读