C语言 为什么我的函数在链表开头插入节点第二次失败



这是我使用双指针添加新节点的函数

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()

您的代码需要许多改进

  1. 你不需要初始化new NULL;可能没有问题,因为这会被优化。

  2. 无需将malloc()或一般void *转换为任何其他指针类型。

  3. 您不要检查malloc()是否成功;您应该检查new是否未被分配NULL这将指示错误。

  4. 您不得free()新分配的指针;您应该在不再需要它时free()它,而不是在分配它后立即使用它。

  5. 你真的应该改进你的代码格式。在原始帖子中完全无法阅读。

最新更新