【问题标题】:Why malloc isn't deallocated? [duplicate]为什么 malloc 没有被释放? [复制]
【发布时间】:2015-03-20 16:51:14
【问题描述】:
#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 有地址。
为什么?

【问题讨论】:

  • 出于同样的原因int a = 5; printf("a=%d\n", a); free(new_node); printf("a=%d\n", a); 将打印a=5 两次。
  • 显然你认为我并没有真正回答你——但我是。就像在我的愚蠢代码中一样,a 的值没有理由改变,new_node 的值没有理由改变。

标签: c malloc free


【解决方案1】:

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

free(new_node);
new_node = NULL;

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

【讨论】:

  • 那我该怎么做才能删除new_node的地址呢?
  • new_node = NULL;(在free()之后)如果对您很重要,但它可能不重要。
  • 不行。地址变成0了。谢谢!!!!!!
【解决方案2】:

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

如果需要检测指针是否已被释放,请将其分配给NULL

new_node = NULL;

您甚至可以编写一个小宏来始终为您执行此操作(尽管我不建议这样做,因为它会使您的代码更难阅读):

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

【讨论】:

  • 那我该怎么做才能删除new_node的地址呢?
  • @user4694907 删除地址没有任何意义。您可以做的是将地址设置为您可以轻松识别为不指向任何地方的地址。例如,NULL!
  • 如果您愿意,可以将指针分配给 NULL,但这并不能真正完成任何事情。一旦你free() 内存,访问它可能会导致任何事情发生——或者什么也不会。但这不关你的事,因为它不再属于你了。
  • 哇好好好!!!!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-05-12
  • 2021-07-23
  • 1970-01-01
  • 2013-05-06
相关资源
最近更新 更多