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

C语言检查节点是否为空触发Segmentation Fault问题排查求助

问题根本原因

你遇到的段错误和指针解引用操作无关,现有代码中isNull里的*node_ptr已经是正确的解引用写法,问题核心是以下几个逻辑错误:

  • appendItem函数中声明的局部变量i没有初始化,直接取地址传给next函数后,next内读取*node_ptr时拿到的是栈上的随机值,后续操作必然触发非法内存访问
  • next函数逻辑完全不符合遍历需求:
    • 函数内部无意义申请了两个Node结构体内存,既没有关联到你实际操作的链表,也没有完成节点寻址逻辑
    • else分支直接return,后续的free语句永远不会执行,会造成持续内存泄漏
    • 用int类型存储节点指针的写法存在严重隐患,64位系统下int只有4字节,会截断8字节的指针地址,很容易触发非法访问
  • appendItem的循环逻辑完全错误:只在进入循环前调用了一次isEmpty,循环内没有更新svoid的值,只要初始svoid !=1就会进入死循环,而且调用next后手动给i++的操作完全打乱了指针值的更新

修复方案

1 重写next函数逻辑

next的核心作用是遍历节点,不需要在内部申请新节点内存,参考修正代码:

// 入参node_ptr存储当前节点指针的地址,执行后会更新为下一个节点的指针
void next(struct system *system, int *node_ptr) {
    // 替换为你实际的下一个节点寻址逻辑,这里是示例写法
    struct Node *current_node = (struct Node *)*node_ptr;
    *node_ptr = (int)current_node->next;
}

如果要兼容64位系统,建议把存储节点指针的变量类型从int替换为uintptr_t或者直接用struct Node *,避免地址截断。

2 修正appendItem函数逻辑

要初始化遍历用的节点指针,同时在循环内更新终止条件:

void appendItem(struct system *system, struct List *list, void *src) {
    // 初始化为链表头节点指针,替换为你实际获取链表头的函数
    int node_ptr = (int)get_list_head(system, list);
    // 循环判断当前节点是否为空
    while (!isNull(system, &node_ptr)) {
        next(system, &node_ptr);
    }
    // 走到这里node_ptr就是空节点位置,可以执行追加逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:27:02