You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

冒泡排序运行异常:出现Segmentation Error(段错误)求助

解决冒泡排序的Segmentation Error(段错误)问题

嘿,我太懂你折腾一小时还没搞定段错误的抓狂感了!先别慌,段错误90%以上都是内存越界访问搞的鬼,咱们结合你的代码片段一步步排查。

首先你的代码里初始化数组的循环写了一半(for (i = ...),先假设你是想生成N个随机数,先从最可能出错的地方说起:

1. 数组初始化时的下标越界

如果你的初始化循环写成了for (i = 0; i <= N; i++),那可就麻烦了——数组a的下标范围是0~9(因为#define N 10),访问a[10]直接超出了数组的内存范围,触发段错误。正确的初始化应该是:

for (i = 0; i < N; i++) {
    a[i] = rand() % 100; // 生成0-99的随机数,你可以调整范围
}

2. 冒泡排序函数的循环边界错误

这是冒泡排序触发段错误的重灾区!如果你的sort函数里循环边界写错,比如内层循环的条件是j <= n - i -1,那j+1就会等于n,访问arr[n]直接越界。给你一个正确的冒泡排序实现参考:

void sort(int arr[], int n) {
    int i, j, temp;
    // 外层循环只需要n-1次,因为最后一个元素会自动归位
    for (i = 0; i < n - 1; i++) {
        // 内层循环每次减少i+1次,因为末尾i个元素已经是有序的了
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

3. show函数的潜在越界问题

如果你的show函数遍历数组时用了i <= n而不是i < n,同样会访问到超出数组范围的元素。正确的show函数示例:

void show(char *msg, int arr[], int n) {
    printf("%s: ", msg);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

完整可运行代码

把这些修正点整合起来,你可以直接运行这段代码对比自己的实现:

#include <stdio.h>
#include <stdlib.h>
#define N 10

void sort(int [], int);
void show(char *, int [], int);

int main(void) {
    int i, j, a[N];
    srand(0);
    
    for (j = 1; j <= 5; j++) { 
        // 正确初始化数组
        for (i = 0; i < N; i++) {
            a[i] = rand() % 100;
        }
        show("排序前", a, N);
        sort(a, N);
        show("排序后", a, N);
        printf("---\n");
    }
    return 0;
}

void sort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

void show(char *msg, int arr[], int n) {
    printf("%s: ", msg);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

最后再提醒一句:排查段错误时,重点盯着所有数组下标的范围,确保每一次访问都在0~n-1之间(n是数组长度),大部分问题都能迎刃而解。

内容的提问来源于stack exchange,提问作者Harris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:37:40