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
相关产品推荐
相关产品推荐

