C语言归并排序算法出现段错误,求问题排查与修复方案
归并排序段错误问题排查与修复
核心错误分析
你的代码触发段错误的直接原因是递归调用时传入了错误的数组长度,导致子数组越界访问:
在mergeSort函数中,递归处理左右子数组时,错误地传入了原数组的总长度length,而非子数组实际的长度:
// 错误写法 mergeSort(leftarray, length); mergeSort(rightarray, length);
左子数组的实际长度是middle,右子数组是length - middle,传入原长度会让递归函数尝试访问超出子数组范围的内存,直接触发段错误。
其他问题
main函数参数类型不符合C标准:string argv[]应改为char* argv[],string不是C原生类型。- 数组输出无分隔符,可读性差。
修复后的完整代码
#include <stdio.h> void mergeSort(int array[], int length); void merge(int leftarray[], int rightarray[], int array[], int length); int main(int argc, char* argv[]) { int unsorted[] = {9, 3, 6, 1, 4, 5, 2, 8, 7}; int length = sizeof(unsorted) / sizeof(int); printf("unsorted array: \n"); for (int i = 0; i < length; i++) { printf("%d ", unsorted[i]); } printf("\n"); mergeSort(unsorted, length); printf("sorted array: \n"); for (int i = 0; i < length; i++) { printf("%d ", unsorted[i]); } printf("\n"); } void mergeSort(int array[], int length) { if(length <= 1) { return; } int middle = length / 2; int leftarray[middle]; int rightarray[length - middle]; for (int i = 0, j = 0; i < length; i++) { if(i < middle) { leftarray[i] = array[i]; } else { rightarray[j] = array[i]; j++; } } // 修复递归参数,传入子数组实际长度 mergeSort(leftarray, middle); mergeSort(rightarray, length - middle); merge(leftarray, rightarray, array, length); } void merge(int leftarray[], int rightarray[], int array[], int length) { int leftSize = length / 2; int rightSize = length - leftSize; int a = 0; int l = 0; int r = 0; while(l < leftSize && r < rightSize) { if (leftarray[l] < rightarray[r]) { array[a] = leftarray[l]; l++; a++; } else { array[a] = rightarray[r]; r++; a++; } } while(l < leftSize) { array[a] = leftarray[l]; l++; a++; } while(r < rightSize) { array[a] = rightarray[r]; r++; a++; } }
内容的提问来源于stack exchange,提问作者NawafBRQ
相关产品推荐
相关产品推荐

