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

递归反转链表时将Reverse_List返回值赋值给指针触发段错误问题咨询

段错误触发原因

  • 首先你的函数存在未定义行为:Reverse_List声明的返回类型是struct node *,但所有执行分支都没有返回合法的指针值:
    1. 递归终止分支if (p->next == NULL)中仅写了return;,没有返回任何符合类型要求的指针
    2. 反转逻辑执行完毕后,也没有对应的return语句返回有效指针
      当你直接调用Reverse_List(p->next)不接收返回值时,这个非法的返回值不会被使用,程序可以正常执行原有逻辑;但一旦你将这个未定义的垃圾值赋值给当前层的局部指针p,p就会变成野指针。
  • 野指针访问直接触发内存访问错误:你给p赋值为非法返回值后,后续执行struct node *ptr1 = p->next时,相当于访问野指针指向的内存地址,该地址基本都属于进程不可访问的非法地址,因此直接触发Segmentation fault。

代码优化建议

如果你希望通过返回值传递反转后的链表头,不需要依赖全局变量存储头节点,可以修正为如下写法:

struct node *Reverse_List(struct node *p)
{
        // 递归终止:空节点或链表最后一个节点
        if (p == NULL || p->next == NULL) {
                return p;
        }
        // 递归反转后续链表,拿到反转后的新头
        struct node *new_head = Reverse_List(p->next);
        // 反转当前节点和后继节点的指向
        p->next->next = p;
        p->next = NULL;
        // 始终返回反转后的链表头
        return new_head;
}

调用时直接用head = Reverse_List(head);即可完成整表反转。

内容的提问来源于stack exchange,提问作者Milan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:24:05