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; ^^^^^ ^^^^^ 

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

释放指针不会改变其值。

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

free指针时,您不会更改其值。 你只是将它指向的任何内存返回到池中。

实际上,假设free取指针的而不是其地址 ,那就足以告诉你该值没有改变,因为没有办法改变它。

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

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

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

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

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

这个SO问题提供了进一步的信息: 释放指针并将其指定为NULL有什么区别?