递归反转链表时将Reverse_List返回值赋值给指针触发段错误问题咨询
段错误触发原因
- 首先你的函数存在未定义行为:
Reverse_List声明的返回类型是struct node *,但所有执行分支都没有返回合法的指针值:- 递归终止分支
if (p->next == NULL)中仅写了return;,没有返回任何符合类型要求的指针 - 反转逻辑执行完毕后,也没有对应的
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
相关产品推荐
相关产品推荐

