这是我使用双指针添加新节点的函数
void insertBefore(node_t **first)
{
node_t *new = NULL;
new = (node_t *) malloc(sizeof(node_t));
new->next = *first;
*first = new;
free(new);
}
如果我使用它一次,一切似乎都很好。但是,如果我再次使用它,我的链接列表就会搞砸。我在下面有输出图像(我的函数将节点插入任何位置也发生了同样的事情)。我试图放置代码的一些非常具体的部分,所以如果你怀疑我一定在其他部分做错了什么,请告诉我。知道我做错了什么吗?
输出图像
只需删除free(new);
.由于new
和*first
具有相同的价值,因此释放new
也会释放*first
。
精炼代码:
void insertBefore(node_t **first)
{
node_t *new = malloc(sizeof(node_t)); //don't cast
if(!new)
{
fputs("Don't have enough memory", stderr);
return;
}
new -> next = *first;
*first = new;
}
这是因为您正在释放内存。
free(new);
您只是将值分配给第一个。
*first=new;
现在第一个和新的将指向相同的内存位置。 然后你正在释放那段记忆。删除行free(new);
。
你free
刚刚分配的节点;每当你尝试使用它时,都会发生未定义的行为,因为*first
变成了一个悬空指针。存储在指针中的地址在函数返回后不再有效free()
。
您的代码需要许多改进
-
你不需要初始化
new
NULL
;可能没有问题,因为这会被优化。 -
无需将
malloc()
或一般void *
转换为任何其他指针类型。 -
您不要检查
malloc()
是否成功;您应该检查new
是否未被分配NULL
这将指示错误。 -
您不得
free()
新分配的指针;您应该在不再需要它时free()
它,而不是在分配它后立即使用它。 -
你真的应该改进你的代码格式。在原始帖子中完全无法阅读。