C - 释放后指针不为空

C - pointer is not null after freeing it

释放后指针的值是否变为NULL?

int* p = malloc(sizeof(*p));

free(p);

if(p==NULL)
    printf("Null\n");
else
    printf("Not null\n");

输出:

 Not null

嗯,我假设不是;

无论如何,我今天早些时候问了一个问题:

在这里查看:

List* head1 = NULL;

insertFront(&head1, 1);
insertFront(&head1, 2);

print(head1);

while (head1)
{

    List *temp = head1;
    head1 = head1->next;
    free(temp);
}

if(head1 == NULL)
    printf("Null\n");
else
    printf("Not null\n");

这种情况下的输出:

Null

在这种情况下,在释放 head1(也包括节点)后,head1 变为空,不是吗?

最后,我是不是漏掉了一些概念?

head1 为空,但 p 不是。

我的问题是:

为什么 head1 和 p 的值不同?

释放指针不会改变它的值。

如果这是您想要的行为,您需要在释放后手动将其设置为 NULL

当你分配内存时,指针自然指向分配块的开头,供你参考。但是,当您释放指针时,只会释放内存本身。

要注意的是,指针仍指向内存中它之前设置的位置,即使该内存块的值不再有用。

设置为NULL不是释放后的自动操作。

当你 free 一个指针时,你并没有改变它的值。您只是将它指向的任何内存返回到池中。

事实上,考虑到 free 获取指针的 value 而不是它的 address,仅此就足够了告诉你这个值没有改变,因为没有办法改变它。

循环结束时 head1NULL 的原因是因为您正在修改循环内 head1 的值以在列表中向下移动直到到达结束.当我们在 next 指针中找到 NULL 值时,我们知道我们在列表的末尾。所以在循环结束时,head1NULL.

如上所述,释放指针与更改其值无关。它只是告诉内存管理可以重用相关块(在堆上)。

这个 SO 问题提供了更多信息:What is the difference between freeing the pointer and assigning it to NULL?

循环条件

while (head1)
       ^^^^^^
{

    List *temp = head1;
    head1 = head1->next;
    free(temp);
}
当下一个节点的数据成员next等于NULL

等于false

head1 = head1->next;
^^^^^         ^^^^^

这与函数 free 没有任何共同之处。该函数按值接受参数。那就是它处理原始[指针的副本。所以原来的指针本身是不会改变的。