释放指针后指针的值是否变为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变为空,不是吗?
最后,我是不是漏掉了一些概念?
head1为空,但p不为空。
我的问题是:
- 为什么head1和p之间的值不同?**
6条答案
按热度按时间8wigbo561#
释放指针不会更改其值。
如果这是您想要的行为,您需要在释放它之后手动将其设置为
NULL
。8zzbczxx2#
当你
free
一个指针的时候,你并没有改变它的值,你只是把它所指向的内存返回到池中。事实上,
free
取指针的 value 而不是它的 address,仅凭这一点就足以告诉你值没有改变,因为没有办法改变它。head1
在循环结束时是NULL
的原因是因为你在循环中修改了head1
的值,使其在列表中向下移动,直到到达末尾。当我们在next
指针中找到一个NULL
值时,我们就知道我们在列表的末尾。所以在循环结束时,head1
是NULL
。njthzxwz3#
循环的条件
当下一节点的数据成员
next
等于NULL时,变为等于false
这与函数
free
没有任何共同之处,该函数通过值接受参数,也就是说,它处理的是原始[指针的副本,因此原始指针本身不会改变。a9wyjsp74#
当你分配内存时,指针自然会指向所分配的块的开头供你引用。然而,当你释放一个指针时,只有内存本身被释放。
问题是指针仍然指向内存中先前设置的位置,即使该内存块的值不再有用。
设置为
NULL
不是释放后的自动操作。wr98u20j5#
如上所述,释放指针与改变指针的值无关,它只是告诉内存管理相关的块(在堆上)可以重用。
此SO问题提供了更多信息:What is the difference between freeing the pointer and assigning it to NULL?
vdzxcuhz6#
free()并不意味着销毁,它只是做它所说的,它释放内存空间,所以在使用free()之后,程序员仍然可以自由地使用指针,通过realloc()将内存空间重新分配到堆上。
示例:
只有当你真的用完了那个指针,并且你不希望它被释放,而是希望它被破坏,不可访问时,你才把它设置为NULL。