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

C语言实现单链表克隆时触发SIGSEGV段错误问题求解

问题根因分析

你的代码存在3个核心问题,其中直接导致段错误的是第一个逻辑错误:

  • 致命逻辑错误:修改了原链表的头指针,且新链表头指针未赋值
    你在cloneFullList函数中,错误地将克隆得到的节点链赋值给了原链表list的front字段,而非你要返回的新链表result的front字段:
    // 错误写法
    if(list->front != NULL)
        list->front = cloneList(result, list->front);
    
    这就导致你返回的result新链表的front字段始终是未初始化的野指针,后续访问list1->front自然触发段错误。同时你还意外修改了原链表的头指针,破坏了原链表的数据。
  • 不必要的内存泄漏
    你的调用代码中两次无意义的malloc都会导致内存泄漏:
    1. 给list1分配内存后马上用cloneFullList的返回值覆盖了指针,刚分配的内存再也无法释放
    2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:36:03