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,仅此就足够了告诉你这个值没有改变,因为没有办法改变它。
循环结束时 head1
是 NULL
的原因是因为您正在修改循环内 head1
的值以在列表中向下移动直到到达结束.当我们在 next
指针中找到 NULL
值时,我们知道我们在列表的末尾。所以在循环结束时,head1
是 NULL
.
如上所述,释放指针与更改其值无关。它只是告诉内存管理可以重用相关块(在堆上)。
这个 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
没有任何共同之处。该函数按值接受参数。那就是它处理原始[指针的副本。所以原来的指针本身是不会改变的。
释放后指针的值是否变为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,仅此就足够了告诉你这个值没有改变,因为没有办法改变它。
循环结束时 head1
是 NULL
的原因是因为您正在修改循环内 head1
的值以在列表中向下移动直到到达结束.当我们在 next
指针中找到 NULL
值时,我们知道我们在列表的末尾。所以在循环结束时,head1
是 NULL
.
如上所述,释放指针与更改其值无关。它只是告诉内存管理可以重用相关块(在堆上)。
这个 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
没有任何共同之处。该函数按值接受参数。那就是它处理原始[指针的副本。所以原来的指针本身是不会改变的。