在C中使用free()函数

时间:2016-09-29 16:50:16

标签: c linked-list malloc free

我写了一个函数,在链接列表的末尾添加动态创建的节点,使用malloc.And然后在函数的最后一行,我试图释放指针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)时,它可以正常工作。

3 个答案:

答案 0 :(得分:2)

您为新节点分配了空间&将其添加到列表中; temp指向此节点。当您致电free(temp)时,您不会释放由占用的空间,而是指向:您刚刚添加到列表中的节点。

答案 1 :(得分:2)

  

我无法打印列表,因为它无限打印随机   但是当我删除/评论最后一行free(temp)时,它可以工作   一切都很好。

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

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

答案 2 :(得分:1)

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

如果该地址被释放,则p->链接将引用解除分配的内存,这将被重用于其他目的,从而破坏数据。