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

我的首个链表程序触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:51:10