首页 > 解决方案 > 为什么我们在插入链表时不使用 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 并且我们不再使用它了?

标签: clinked-listdynamic-memory-allocationfreesingly-linked-list

解决方案


如果您将释放指针指向的节点,则结果是由于此语句而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;
}

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


推荐阅读