释放后指针的值是否变为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之间的值不同?
答案 0 :(得分:5)
释放指针不会改变其值。
如果这是您想要的行为,则需要在释放后手动将其设置为NULL
。
答案 1 :(得分:4)
当你free
指针时,你没有改变它的值。你只是将它指向的任何内存返回到池中。
事实上,假设free
获取指针的值而不是地址,那就足以告诉您值isn'改变了,因为没有办法改变它。
循环结束时head1
为NULL
的原因是因为您正在修改循环内head1
的值以沿着列表向下移动直到它到达结尾。我们知道当我们在NULL
指针中找到next
值时,我们就在列表的末尾。因此,在循环结束时,head1
为NULL
。
答案 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?