free() 到全局链表 C
free() to global linked list C
我的程序中有一些全局链表,还有一个 "generic" 函数获取指向头的指针,并释放所有节点:
void freelist(list* head) {
list* tmp;
while (head != NULL) {
tmp = head;
head = head->next;
free(tmp);
}
}
函数运行良好,最后是指向列表(头)的本地指针,
变成了NULL
。但是列表的全局指针没有更改为 NULL
,仍然指向 "empty" 列表的开头(不是我的值,释放后的值)。
假设你的最后一个节点指向 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);
}
}
释放后尝试将指针设置为 NULL 是否值得值得商榷。因为你不应该在释放列表后触摸 head
指针并且 head
指向 "old value" 没有任何问题 - 在释放后使用它是未定义的行为。
撇开这一点不谈,如果您确实想通过 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 中的所有内容都是按值传递的。这就是为什么只有 freelist
中的 head
的本地副本变为 NULL 而不是您传递给它的副本。
我的程序中有一些全局链表,还有一个 "generic" 函数获取指向头的指针,并释放所有节点:
void freelist(list* head) {
list* tmp;
while (head != NULL) {
tmp = head;
head = head->next;
free(tmp);
}
}
函数运行良好,最后是指向列表(头)的本地指针,
变成了NULL
。但是列表的全局指针没有更改为 NULL
,仍然指向 "empty" 列表的开头(不是我的值,释放后的值)。
假设你的最后一个节点指向 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);
}
}
释放后尝试将指针设置为 NULL 是否值得值得商榷。因为你不应该在释放列表后触摸 head
指针并且 head
指向 "old value" 没有任何问题 - 在释放后使用它是未定义的行为。
撇开这一点不谈,如果您确实想通过 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 中的所有内容都是按值传递的。这就是为什么只有 freelist
中的 head
的本地副本变为 NULL 而不是您传递给它的副本。