C Primer Plus的第17章 - 关于如何释放整个链表

end*_*ess 0 c malloc free list

我正在阅读C Primer Plus的第17章,这里是释放书中链接列表的代码段:

/* Program done, so free allocated memory */
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf("Bye!\n");
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

在while语句中,"current"变量在被释放后如何获得下一个值?我搜索了一些代码段以在Web上释放链接列表,并且他们似乎在while语句中使用了两个指针以避免之前的问题.

但是,如果这是一个错误,我在勘误表中找不到这个.那有什么意见吗?

谢谢!

unw*_*ind 5

是的,这显然是一个错误.访问已经free()d的堆内存调用未定义的行为.坏书!

正确的方法是next在调用之前缓冲指针free():

while (head != NULL)
{
    struct list_node *next = head->next;
    free(head);
    head = next;
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 无需记住列表的旧头部,因此请删除current并更新head.
  • 为了本地化,定义循环内下一个节点的缓冲.不确定正确的类型,没有这本书(幸运的是!)并且它不在问题中.