微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我们在插入链表时不使用 free(node) ?

如何解决为什么我们在插入链表时不使用 free(node) ?

void push(struct node **head,int data)
{
        struct node* newnode = malloc(sizeof(struct node));
        newnode->data = data;
        newnode->next = *head;
        *head=newnode;

}

我遇到了这个函数,我想知道为什么我们不使用 free(newnode) ,因为我们将它的值影响到 *head 并且我们不再使用它了?

解决方法

如果您将释放指针 newnode 所指向的节点,那么由于此语句,指针 *head 将被释放

*head=newnode;

将指向已删除的节点。因此,指针 *head 将无效。

那就是在这个声明之后

*head=newnode;

两个指针*headnewnode都指向同一个节点。如果你会写

free( newnode );

free( *head );

指向的节点将被删除。所以你没有添加到列表中。您要添加到您删除的列表中的内容。:) 此外,您将指针 *head 中的正确值(在调用函数之前)替换为一个无效值(地址),该值在删除节点后无处可去。

注意如下方式定义函数会更正确

int push( struct node **head,int data )
{
    struct node *newnode = malloc( sizeof( struct node ) );
    int success = newnode != NULL;

    if ( success )
    {
        newnode->data = data;
        newnode->next = *head;

        *head = newnode;
    }

    return success;
}

在这种情况下,当没有足够的内存来分配新节点时,函数不会有未定义的行为。并且该功能的用户可以检查是否添加新节点成功。

,

您不能在此处执行 free(newnode);,因为新节点已添加到列表中,因此稍后会使用。

此外,变量 newnode 本身(通常)也分配在堆栈上,并且会在退出函数时自动释放,因此您不需要多次释放它。

,

因为*head 会引用死者newnode。你必须在代码的最后释放它们。 实际上,您不需要将 head 作为双指针。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。