C - 指针在释放后不为空

时间:2017-01-27 20:01:19

标签: c pointers free dynamic-memory-allocation

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

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

free(p);

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

输出:

 Not null

好吧,我不认为;

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

在这里查看: C - How can I free dynamically allocated memory?

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变为null,不是吗?

最后,我错过了一些概念吗?

head1为空,但p不是。

我的问题是:

为什么head1和p之间的值不同?

5 个答案:

答案 0 :(得分:5)

释放指针不会改变其值。

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

答案 1 :(得分:4)

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

事实上,假设free获取指针的而不是地址,那就足以告诉您值isn'改变了,因为没有办法改变它。

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

答案 2 :(得分:2)

循环的条件

while (head1)
       ^^^^^^
{

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

等于next

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

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

答案 3 :(得分:1)

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

问题是指针仍指向先前设置的内存中的那个位置,即使该内存块的值不再有用。

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

答案 4 :(得分:0)

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

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