我的程序中有一些全局链接列表,还有一个“通用”函数,该函数获取指向头的指针并释放所有节点:
void freelist(list* head) {
list* tmp;
while (head != NULL) {
tmp = head;
head = head->next;
free(tmp);
}
}
函数运行良好,最后,指向列表的本地指针(头),
成为NULL
。但是列表的全局指针没有更改为NULL
,而是仍然指向“空”列表的开始(不是我的值,而是释放后的值)。
答案 0 :(得分:2)
假设最后一个节点指向NULL,并且需要在freekist中使用双指针以使全局指针为NULL。
换句话说,如果要将全局头更改为NULL,请将globalHead的地址赋予freelist函数,则需要双指针。
您可以像下面这样呼叫空闲列表。
freelist(&globalHead);
您的自由列表定义如下所示。
void freelist(list **head)
{
list* tmp;
if(head ==NULL)
return;
while(*head!=NULL)
{
tmp=*head;
*head=(*head)->next;
free(tmp);
}
}
答案 1 :(得分:2)
释放指针后是否值得将指针设置为NULL是否值得商bat。因为无论如何在释放列表之后您都不应该触摸head
指针,并且head
指向“旧值”没有任何问题-释放后使用它是不确定的行为。
抛开这些,如果您想通过free'ing函数将其设置为NULL,则必须将指针传递给head
,如下所示:
void freelist(list **head)
{
list* tmp, *p = *head;
while(p != NULL){
tmp = head;
p = p->next;
free(tmp);
}
*head = NULL;
}
并将其称为:
freelist(&head); // Assuming 'head' is of type 'list *'.
这是因为C中的所有内容都被值传递了。这就是为什么只有head
中freelist
的本地副本变为NULL而不是您传递给它的副本的原因。