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
相关产品推荐
相关产品推荐

