C语言实现单链表克隆时触发SIGSEGV段错误问题求解
问题根因分析
你的代码存在3个核心问题,其中直接导致段错误的是第一个逻辑错误:
- 致命逻辑错误:修改了原链表的头指针,且新链表头指针未赋值
你在cloneFullList函数中,错误地将克隆得到的节点链赋值给了原链表list的front字段,而非你要返回的新链表result的front字段:
这就导致你返回的// 错误写法 if(list->front != NULL) list->front = cloneList(result, list->front);result新链表的front字段始终是未初始化的野指针,后续访问list1->front自然触发段错误。同时你还意外修改了原链表的头指针,破坏了原链表的数据。 - 不必要的内存泄漏
你的调用代码中两次无意义的malloc都会导致内存泄漏:- 给
list1分配内存后马上用cloneFullList的返回值覆盖了指针,刚分配的内存再也无法释放 - 给
curr1分配内存后马上用list1->front覆盖了指针,同样造成内存泄漏
- 给
- 冗余判断(非BUG,属于代码优化点)
cloneList中不需要判断head->next是否非空,直接赋值即可:result->next = cloneList(list, head->next);,因为head==NULL时cloneList会直接返回NULL,逻辑完全等价。
修正后的代码
1. 修复cloneFullList函数
SinglyLinkedList *cloneFullList(SinglyLinkedList *list) { if(list == NULL) return NULL; SinglyLinkedList *result = (SinglyLinkedList *)malloc(sizeof(SinglyLinkedList)); result->size = list->size; // 修正:给新链表的front赋值,而非修改原链表 if(list->front != NULL) result->front = cloneList(result, list->front); else result->front = NULL; // 新增:处理原链表为空的情况,避免野指针 return result; }
2. 修复cloneList函数(可选优化)
SinglyLinkedListNode *cloneList(SinglyLinkedList *list, SinglyLinkedListNode *head) { if(head == NULL) return NULL; SinglyLinkedListNode *result = (SinglyLinkedListNode *)malloc(sizeof(SinglyLinkedListNode)); result->data = head->data; // 去掉冗余判断 result->next = cloneList(list, head->next); return result; }
3. 修复调用代码
// 去掉多余的malloc,直接接收克隆函数返回值即可 SinglyLinkedList *list1 = cloneFullList(list); // 去掉多余的malloc,直接指向链表头节点 SinglyLinkedListNode *curr1 = list1->front;
额外提醒
你当前的实现是浅拷贝:data字段只是复制了指针本身,没有复制指针指向的实际数据。如果原链表的data指向的内存被释放,新链表的data会变成野指针。如果你需要深拷贝,需要根据data指向的数据类型,额外分配内存复制实际数据内容。
内容的提问来源于stack exchange,提问作者thezephyrus90
相关产品推荐
相关产品推荐

