C语言链表归并排序实现出现segmentation fault段错误问题求助
问题根因及修复方案
核心错误原因
merged函数边界无返回值:当链表长度≤1时,函数未显式返回head,返回值为栈上的随机野指针,后续访问该指针直接触发段错误。- 递归调用未接收排序后的新头:
merged的返回值是排序后的链表新头,原有代码仅调用merged(lists[0])、merged(lists[1]),未将新头赋值回lists数组。例如拆分出的子链表4->2排序后新头是2,但原有代码传给合并函数的还是旧头4,此时4的next已经被置空,既导致合并逻辑错误,也会触发后续指针访问异常。 - 附加问题:
divide函数中malloc申请的数组未释放,会造成内存泄漏。
修复代码
修正后的merged函数
node merged(node head){ // 边界条件直接返回当前头结点 if(length(head) <= 1){ return head; } node *lists = divide(head); // 接收排序后的新头结点 lists[0] = merged(lists[0]); lists[1] = merged(lists[1]); node sorted_head = mergesorted(lists[0], lists[1]); // 释放divide中申请的内存,避免泄漏 free(lists); return sorted_head; }
可选优化:divide函数避免浮点运算
原代码用ceilf计算mid存在浮点精度风险,可改用整数运算实现等价逻辑:
node* divide(node head){ int len = length(head); int mid = len / 2; node* ret = malloc(sizeof(node)*2); node tmp1 = head; while (mid > 1){ tmp1 = tmp1->next; mid--; } node tmp2 = tmp1->next; tmp1->next = NULL; ret[0] = head; ret[1] = tmp2; return ret; }
内容的提问来源于stack exchange,提问作者ahmed ben
相关产品推荐
相关产品推荐

