我的首个链表程序触发Segmentation Fault错误,请求修复指导
修复你的链表段错误问题
问题根源
- malloc错误判断逻辑错误:
add_to_list函数里,你判断head == NULL来提示malloc失败,但实际应该检查malloc返回的node指针是否为NULL——这才是内存分配失败的标志。 - 栈节点未初始化:
main中声明的list node是栈上的局部变量,它的next成员没有被初始化,属于野指针。当print_list遍历到这个野指针时,就会触发段错误。 - 未接收链表头返回值:调用
add_to_list后,你没有保存它返回的新链表头指针,导致新创建的节点没有和原链表正确关联,原节点的next依然是野指针。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct list { int data; struct list *next; } list; list *add_to_list(list *head, int data) { list *node = malloc(sizeof(list)); // 修正:检查malloc是否成功 if (node == NULL) { fprintf(stderr, "ERROR: malloc failed in add_to_list\n"); exit(EXIT_FAILURE); } node->data = data; node->next = head; return node; } void print_list(list *head) { list *cur = head; while (cur) { printf("%d\n", cur->data); cur = cur->next; } } int main() { // 初始化链表头为空指针,代表空链表 list *head = NULL; int input; scanf("%d", &input); // 将新节点作为新的链表头 head = add_to_list(head, input); // 可测试添加更多节点 // head = add_to_list(head, 5); // head = add_to_list(head, 10); print_list(head); // 释放链表内存,避免泄漏 list *temp; while (head) { temp = head; head = head->next; free(temp); } return 0; }
核心修复点说明
- 改用动态链表的标准写法:用
list *head作为链表头,初始化为NULL表示空链表,而非栈上的固定节点。 - 修正
malloc的错误检查逻辑,确保内存分配失败时能正确报错并退出。 - 接收
add_to_list返回的新链表头,保证所有节点正确串联成链表。 - 添加内存释放代码,这是良好的编程习惯,避免内存泄漏。
内容的提问来源于stack exchange,提问作者iskander
相关产品推荐
相关产品推荐

