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

C语言开发组织管理软件调用addAccount函数出现segmentation fault错误求助

段错误原因排查
  • 传参逻辑错误(核心触发原因)
    C语言默认采用值传递,你当前addAccount函数的head、tail、accounts都是指针值传递,函数内部修改这三个指针的指向不会同步到函数外的实参:
    1. 初始状态下如果head和tail均为NULL,满足head == tail的判断分支,此时如果传入的accounts是未初始化的野指针/NULL,直接访问accounts->id会直接触发段错误
    2. 非初始状态下你修改了局部变量tail = a,但函数外的实参tail完全没有变化,后续调用时链表逻辑完全混乱,访问非法内存触发段错误
    3. 原代码初始分支重复对accounts->id赋值1,属于冗余代码,虽然不会触发段错误但建议删除
  • 链表节点关联逻辑缺失
    非初始分支中,你仅设置了新节点a的prev指向原尾节点,但没有给原尾节点的next赋值为a,链表关联断裂,后续遍历链表时会访问野指针
  • 潜在风险点(也可能触发段错误)
    1. malloc未做返回值校验,如果内存分配失败返回NULL,后续访问a->name等成员会直接触发段错误
    2. scanf("%s", accounts->name)没有限制输入长度,输入超过199字符时会发生缓冲区溢出,覆盖栈上其他内存数据,也可能触发段错误
修复方案

建议调整函数参数为二级指针,保证指针修改可以同步到外部实参,同时统一节点创建逻辑,修复后的代码示例如下:

struct account {
    char name[200];
    int id;
    struct account* next;
    struct account* prev;
};

void addAccount(struct account** head, struct account** tail) {
    struct account* a = (struct account*)malloc(sizeof(struct account));
    if (a == NULL) {
        p("Memory allocation failed");
        return;
    }
    p("Enter name");
    // 限制输入长度避免缓冲区溢出
    scanf("%199s", a->name);

    if (*head == NULL && *tail == NULL) {
        // 空链表添加第一个节点
        a->id = 1;
        a->next = NULL;
        a->prev = NULL;
        *head = a;
        *tail = a;
    } else {
        a->id = (*tail)->id + 1;
        a->next = NULL;
        a->prev = *tail;
        (*tail)->next = a;
        *tail = a;
    }
    p("Account added");
}

调用时传入head和tail的地址即可:addAccount(&head, &tail);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:06:01