单链表节点删除C语言程序出现段错误问题排查
单链表删除节点段错误的问题分析与修复
你的Delete函数存在几个关键问题,直接触发了段错误:
- 未处理尾节点删除场景:当要删除的节点是链表最后一个节点时,
p->next为NULL,此时访问p->next->symbol、p->next->addr会触发空指针解引用,直接引发段错误。 - 单节点链表处理缺失:如果链表只有一个节点(
size=1),同样会触发上述空指针访问问题。 - 未释放被删除节点内存:代码中用
q指向了要被删除的后继节点,但没有调用free(q)释放内存,会造成内存泄漏。
修正后的Delete函数代码
void Delete(char *sym) { struct SymbTab *target = Search(sym); if (target == NULL) { return; } struct SymbTab *prev = NULL; struct SymbTab *curr = head; // 假设head是你的链表头节点指针,需根据实际代码调整 // 遍历找到目标节点的前驱节点 while (curr != NULL && curr != target) { prev = curr; curr = curr->next; } // 处理头节点删除 if (prev == NULL) { head = target->next; } // 处理中间/尾节点删除 else { prev->next = target->next; } // 释放目标节点内存 free(target); size--; }
关键说明
- 改用前驱节点指向后继节点的标准删除逻辑,覆盖了头节点、中间节点、尾节点的所有场景,从根源避免了空指针访问。
- 必须调用
free(target)释放被删除节点的堆内存,避免内存泄漏。 - 代码中假设
head是链表头指针,需要根据你的实际代码调整变量名。
内容的提问来源于stack exchange,提问作者Zaynab B.
相关产品推荐
相关产品推荐

