C – 指针在释放后不为空
释放后指针的值是否变为NULL?
int* p = malloc(sizeof(*p)); free(p); if(p==NULL) printf("Null\n"); else printf("Not null\n");
输出:
Not null
好吧,我假设没有;
无论如何,我今天早些时候提出了一个问题:
在这里查看: C – 如何释放动态分配的内存?
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为null,但p不是。
我的问题是:
为什么head1和p之间的值不同?
循环的条件
while (head1) ^^^^^^ { List *temp = head1; head1 = head1->next; free(temp); }
next
一个节点的下一个数据成员等于NULL时,它变为等于false
head1 = head1->next; ^^^^^ ^^^^^
这与free
function没有任何共同之处。 该函数按值接受参数。 那就是它处理原始[指针的副本。 所以原始指针本身不会改变。
释放指针不会改变其值。
如果这是您想要的行为,则需要在释放后手动将其设置为NULL
。
free
指针时,您不会更改其值。 你只是将它指向的任何内存返回到池中。
实际上,假设free
取指针的值而不是其地址 ,那就足以告诉你该值没有改变,因为没有办法改变它。
在循环结束时head1
为NULL
的原因是因为您正在修改循环内head1
的值以沿着列表向下移动直到它到达结尾。 我们知道当我们next
指针中找到NULL
值时,我们就在列表的末尾。 所以在循环结束时, head1
为NULL
。
当您分配内存时,指针自然指向已分配块的开头供您引用。 但是,释放指针时,只释放内存本身。
问题是指针仍然指向它先前设置的内存中的那个位置,即使该内存块的值不再有用。
释放后,设置为NULL
不是自动操作。
如上所述,释放指针与更改其值无关。 它只是告诉内存管理可以重用相关的块(在堆上)。
这个SO问题提供了进一步的信息: 释放指针并将其指定为NULL有什么区别?