【问题标题】:using free() function in C在 C 中使用 free() 函数
【发布时间】:2016-09-29 16:50:16
【问题描述】:

我写了一个函数来在链表的末尾添加动态创建的节点,使用 malloc。然后在函数的最后一行,我尝试为指针 temp 释放内存空间。

addnodelast(int data){
struct node* temp =(struct node*)malloc(sizeof(struct node));
temp->data=data;
temp->link=NULL;
struct node*p=head;
while(p->link!=NULL)
{
    p=p->link;
}
p->link=temp;
free(temp);

}

但是在执行时,我无法打印列表,因为它无限打印随机值。但是当我删除/注释最后一行 free(temp) 时,一切正常。

【问题讨论】:

  • 我在这段代码中看不到任何打印。而且,我在这里根本看不到任何有意义的东西。
  • 释放刚刚添加的节点是逻辑错误。
  • 你过早地打电话给free()

标签: c linked-list malloc free


【解决方案1】:

您为新节点分配空间并将其添加到列表中; temp 指向这个节点。当您调用free(temp) 时,您并没有释放temp 占用的空间,而是释放它指向的空间:您刚刚添加到列表中的节点。 p>

【讨论】:

  • 是的,使用 free(temp) 后,temp 不会指向新创建的节点。但这不应该影响列表,因为我已经存储了节点的地址(p->link =temp)。那么为什么我的打印功能在使用免费时不起作用?
  • 你认为free 是做什么的?
  • @KrishnaBagaria 因为在free() 之后记忆不再“属于”你。它可以被另一个进程覆盖。
  • @ScottHunter 假设 temp 变量的地址为 100,其内容为 200(即新创建节点的地址)。所以 free(temp) 擦除了内存位置 200 而不是 100?
  • @KrishnaBagaria:free 不会“擦除”任何东西;它释放该内存,以便可以在其他地方使用(和修改)它。但是您是正确的,因为它不会更改包含被释放地址的变量。
【解决方案2】:

我无法打印列表,因为它是无限随机打印的 values.But 当我删除/评论最后一行免费(临时)时,它可以工作 一切都好。

这并不奇怪。当您 free() 添加到列表中的节点然后尝试打印/访问它时,您正在调用 undefined behaviour 因为就您的程序而言,节点(其内存已被取消分配)不再“存在” .所以,你们这些节点都变成了dangling pointers

因此,在不再需要访问列表之前,您不应该释放()节点。

【讨论】:

    【解决方案3】:

    在 p->link = temp 之后,temp 变量的值也存在于 p->link 中。

    如果该地址被释放,那么 p->link 将引用已释放的内存,这些内存将被重新用于其他目的,从而破坏数据。

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2020-06-27
      • 2021-04-07
      • 2021-10-09
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多