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

时间:2012-12-07 21:41:00

标签: 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"元素始终打印。所以看起来头部元素没有被正确删除。怎么了?

1 个答案:

答案 0 :(得分:4)

'head'是一个函数参数,具有局部范围。因此,尽管在函数末尾将其设置为NULL,但这将无效,因为函数刚刚返回,将该变量移出范围。

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

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

要修复它,只需在调用此函数以释放列表后将指针退出

free_all(actual_head);
actual_head = NULL;

你可以传入一个指向指针的指针,以使函数内的指针为NULL,但这对于这种情况来说似乎过于复杂。