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

C语言如何正确遍历链表避免缓冲区溢出问题

问题根因

你的两段代码的共同错误是没有判断指针ptr本身是否为非空,就直接访问ptr->next成员:

  • 初始版本的while (ptr->next != NULL)判断执行时,如果ptr本身是NULL,访问ptr->next就属于非法内存访问,触发堆缓冲区溢出报错
  • 后续修改的版本新增的外层判断依旧是if (ptr->next != NULL),同样先访问了ptr->next,非法访问的严重程度更高,直接触发段错误

修复方案

根据你的遍历场景选择正确的判断逻辑:

  1. 如果你需要遍历链表的所有节点并逐个处理:
// 先判断当前指针本身非空
while (ptr != NULL) {
    // 处理当前节点的逻辑写在这里
    ptr = ptr->next;
}
  1. 如果你需要定位到链表的最后一个节点(比如要在链表尾部追加新节点):
// 先校验ptr本身非空
if (ptr != NULL) {
    while (ptr->next != NULL) {
        // 中间处理逻辑
        ptr = ptr->next;
    }
    // 此处ptr指向链表最后一个节点,可执行追加等操作
}

额外排查建议

如果修改后还是有报错,可以额外排查以下常见问题:

  • 链表头指针初始化是否正确设置为NULL,是否存在节点内存释放后未将对应指针置空的野指针问题
  • 遍历过程中是否存在误修改ptr->next指向,导致链表断裂或指向未分配内存的情况
  • 链表节点内存分配时是否分配了足够的空间,是否存在结构体成员越界访问的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:03