我写了一个函数,在链接列表的末尾添加动态创建的节点,使用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)时,它可以正常工作。
答案 0 :(得分:2)
您为新节点分配了空间&将其添加到列表中; temp
指向此节点。当您致电free(temp)
时,您不会释放由占用的空间,而是指向:您刚刚添加到列表中的节点。
答案 1 :(得分:2)
我无法打印列表,因为它无限打印随机 但是当我删除/评论最后一行free(temp)时,它可以工作 一切都很好。
这并不奇怪。当您free()
添加到列表中的节点然后尝试打印/访问它时,您正在调用undefined behaviour,因为节点(其内存已取消分配)不再“存在”到目前为止你的程序是关心的。所以,你们这些节点都变成了dangling pointers。
因此,在不再需要访问列表之前,不应该释放()节点。
答案 2 :(得分:1)
在p-> link = temp之后,temp变量的值也存在于p-> link中。
如果该地址被释放,则p->链接将引用解除分配的内存,这将被重用于其他目的,从而破坏数据。