递归创建链表后打印出现Segmentation fault (core dumped)错误求助
递归创建链表出现无限输出与段错误的问题修复
你的代码核心问题是所有链表节点都在栈上分配局部变量,函数执行完毕后栈内存会被回收,导致指针指向无效内存,触发未定义行为(无限输出、段错误都是典型表现)。
具体错误点拆解
makeNode函数里创建的struct ListNode node是栈上局部变量,返回时会拷贝这个结构体,但node.next指向的也是栈上的变量(比如makeNodeFromList里的next),当外层函数返回后,这块内存已经失效,变成野指针。makeNodeFromList中的struct ListNode next是局部变量,递归调用完成后赋值给它,但当makeNodeFromList返回时,next的内存被释放,你用&next作为参数传给makeNode,相当于让新节点的next指向一块已经被回收的内存。- 打印链表时,访问这些野指针会导致内存乱读,出现无限输出某个值,最终触发段错误。
修复方案:用动态内存分配创建节点
链表节点需要在堆上分配内存(用malloc),这样内存不会随函数返回释放,指针始终有效。
修正后的完整代码:
#include <stdio.h> #include <stdlib.h> struct ListNode { int val; struct ListNode *next; }; // 动态创建单个节点 struct ListNode* makeNode(int val, struct ListNode* next) { struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode)); if (node == NULL) { // 检查内存分配是否成功 perror("malloc failed"); exit(EXIT_FAILURE); } node->val = val; node->next = next; return node; } // 递归从数组创建链表,返回链表头指针 struct ListNode* makeNodeFromList(int arr[], int length, int index) { if (index == length) { // 基准条件:索引超出数组范围,返回NULL return NULL; } // 先创建后续节点,再让当前节点指向后续节点 struct ListNode* nextNode = makeNodeFromList(arr, length, index + 1); return makeNode(arr[index], nextNode); } // 递归打印链表 void printNode(struct ListNode *l) { if (l == NULL) { // 先判断指针是否为空,避免访问空指针 return; } printf("%d", l->val); if (l->next != NULL) { printf("\t"); printNode(l->next); } else { printf("\n"); } } // 释放链表内存,避免内存泄漏 void freeList(struct ListNode* head) { if (head == NULL) { return; } freeList(head->next); free(head); } int main() { int arr[3] = {1,2,3}; struct ListNode* head = makeNodeFromList(arr, 3, 0); printNode(head); freeList(head); // 释放内存 return 0; }
关键修改说明
makeNode改为返回struct ListNode*指针,用malloc在堆上分配节点内存,确保内存持久有效。makeNodeFromList也改为返回指针,基准条件调整为index == length时返回NULL,逻辑更清晰。- 打印函数先判断
l是否为空,避免空指针访问。 - 添加
freeList函数,递归释放链表内存,防止内存泄漏。
内容的提问来源于stack exchange,提问作者fruitbat
相关产品推荐
相关产品推荐

