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

C语言实现归并排序时出现Segmentation Fault 11错误求助

问题排查:归并排序中的Segmentation Fault 11错误

核心错误原因

你的代码中*tmp数组的下标访问逻辑完全错误*,这是导致段错误的直接原因:

  • tmp数组的大小是(f-d+1),对应当前要合并的子数组长度,它的有效下标范围是0到(f-d)
  • 但你在循环中使用i从d到f直接作为tmp的下标,当d >= 1时(比如处理数组后半段,例如d=5, f=9),tmp的大小仅为5,你却访问tmp[5]、tmp[6]等超出数组范围的位置,触发内存越界,直接导致Segmentation Fault。

修正后的归并排序函数

将tmp的下标改为从0开始计数,使用独立的索引变量遍历tmp,最后将tmp元素复制回原数组对应区间:

void trieFusion(int *t, int d, int f){
    if (f == d)
        return;
    
    int m = (f - d)/2 + d;
    trieFusion(t, d, m);
    trieFusion(t, m + 1, f);
    
    int tmp[(f - d + 1)];
    int pg = d;    
    int pd = m + 1;
    int k = 0; // 专门用于遍历tmp的索引

    // 合并两个有序子数组到tmp
    while (pg <= m && pd <= f) {
        if (t[pg] < t[pd]) { 
            tmp[k++] = t[pg++];
        } else {  
            tmp[k++] = t[pd++];
        }
    }
    // 处理第一个子数组的剩余元素
    while (pg <= m) {
        tmp[k++] = t[pg++];
    }
    // 处理第二个子数组的剩余元素
    while (pd <= f) {
        tmp[k++] = t[pd++];
    }
    // 将tmp中的有序元素复制回原数组的[d, f]区间
    for(int i = d; i <= f; i++) { 
        t[i] = tmp[i - d];
    }
}

额外优化说明

原代码的for循环嵌套多条件判断的写法可以简化为多个while循环,不仅逻辑更清晰,还能减少重复的边界检查,降低出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:10:27