为什么malloc没有被解除分配?

时间:2015-03-20 16:51:14

标签: c malloc free

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    struct node *pre;
    struct node *next;
    int data;
}NODE; //struct declaration

int main(){

    NODE *new_node=(NODE*)malloc(sizeof(NODE)); //memory allocation

    printf("\nnew_node addr: %d\n",new_node);

    free(new_node); //deallocation

    printf("new_node addr: %d\n",new_node);


}

结果:

new_node addr: 2097152
new_node addr: 2097152
Program ended with exit code: 0

为什么结果相同?
我释放new_node的内存。但是new_node有地址。
为什么??

2 个答案:

答案 0 :(得分:8)

调用free释放指针指向的内存,但不会更改存储在该指针中的内存地址。调用free后,您不应尝试使用内存。为安全起见,您可以手动将指针设置为NULL:

free(new_node);
new_node = NULL;

你卖掉了你的房子,它已被拆除,但你仍然把地址写在一张纸上。

答案 1 :(得分:7)

free()不会更改传递给它的指针的值。它只是释放在该指针处分配的内存。换句话说,指针仍然指向同一个地方,不再保证那里有任何东西。

如果您需要检测指针已被释放,请将其指定给NULL

new_node = NULL;

你甚至可以写一个小宏来为你做这件事(虽然我不推荐它,因为它会让你的代码更难阅读):

#define FREE_SET_NULL(pointer) free(pointer);pointer=NULL;