我尝试使用以下代码删除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"元素始终打印。所以看起来头部元素没有被正确删除。怎么了?
答案 0 :(得分:4)
'head'是一个函数参数,具有局部范围。因此,尽管在函数末尾将其设置为NULL,但这将无效,因为函数刚刚返回,将该变量移出范围。
无论传入什么变量,仍然会指向列表的头部(尽管此内存已被释放,但它可能仍包含合理的数据)。
头已经被释放。它不一定看起来那样,因为你保留了一个指向它曾经存在的内存的指针。
要修复它,只需在调用此函数以释放列表后将指针退出。
free_all(actual_head);
actual_head = NULL;
你可以传入一个指向指针的指针,以使函数内的指针为NULL,但这对于这种情况来说似乎过于复杂。