无法从单链表的最后一个剩余节点删除数据

标签 c linked-list free

<分区>

我正在尝试使用以下代码删除 C 中单链表的所有节点。

void free_all(struct cd *head){                                                 
    struct cd *tmp;                                                                                                                                            
    tmp = head->next;                                                           
    while(tmp != NULL){                                                         
        head->next = tmp->next;                                                 
        free(tmp);                                                              
        tmp = head->next;                                                       
    }                                                                           
    free(head->next);                                                           
    free(head);                                                                 
    head=NULL;                                                                  
}          

但是如果我在那之后打印链表的所有元素以检查列表是否为空,则始终打印“head”元素。所以看起来 head 元素没有被正确删除。怎么了?

最佳答案

'head' 是一个函数参数,具有局部作用域。因此,尽管您在函数末尾将其设置为 NULL,但这将没有任何效果,因为函数只是在之后立即返回,将该变量移出范围。

无论传入什么变量,仍将指向列表的头部(尽管此内存已被释放,但它可能仍包含似是而非的数据)。

头部已经被释放。它看起来不一定是那样,因为您保留了一个指向它曾经所在的内存的指针。

要修复它,只需在调用此函数释放列表后将指针置空即可。

free_all(actual_head);
actual_head = NULL;

您可以传递一个指向指针的指针,以便在函数内将指针置为 NULL,但对于这种情况,这似乎过于复杂。

关于无法从单链表的最后一个剩余节点删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13771415/

相关文章:

c - while() 循环未按预期工作。可能是什么原因?

c++ - 链表c++,重载[],整体结构

c - PIC24 上的 Free() 段错误

c - 是否可以创建无指针函数?

c - 如何在文件中搜索以字符串开头的特定行

c - 将 pragma 扩展为注释(对于 doxygen)

统计小写字母,直到输入为字符串

c - 使用 RPATH 但不使用 RUNPATH?

c++ - 堆栈溢出与我的析构函数

c - 使用 malloc 和 free 理解指针