从 insert_beg() 函数出来时,分配给指针的内存不会保留和丢失

The memory allocated to a pointer is not retained and lost when coming out of the insert_beg() function

一旦我们离开函数 insert_beg,分配给头指针的内存就会丢失,并且头指针再次变为 NULL。尽管我正在传递指针,但为什么会出现这种行为?请指导我如何保留由 malloc() 分配的内存块。

#include <stdlib.h>

struct node
{
    int data;
    struct node *next;
};

void insert_beg(struct node *head, int data)
{
    if(head==NULL)
    {
        struct node *tmp_node;
        tmp_node = (struct node*)malloc(sizeof(struct node));
        tmp_node->data = data;
        tmp_node->next = NULL;
        head = tmp_node;
    }

    else
    {
        struct node *tmp_node;
        tmp_node = (struct node*)malloc(sizeof(struct node));
        tmp_node->data = data;
        tmp_node->next = head;
        head = tmp_node;
    }
}


void display(struct node *head)
{
    if(head==NULL)
    {
        printf("UNDERFLOW");
    }

    else
    {
        struct node *tmp = head;

        while(tmp!=NULL)
        {
            printf("%d ", tmp->data);
            tmp = tmp->next;
        }
    }
    
}

int main()
{
    struct node *head = NULL;
    insert_beg(head,12);
    display(head);
 
} ```

Expected output: 12
Observed output: UNDERFLOW

函数insert_beg处理传递给它的指向头节点的指针值的副本。参数struct node *head是函数的局部变量,获取原指针值的副本指向头节点。所以局部变量的变化不影响用作参数的原始指针

您应该通过引用将指针传递给头节点。

在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。

函数可以通过以下方式声明和定义。

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

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

    return success;
}

而且函数可以这样调用

insert_beg( &head, 12 );

或喜欢

if ( !insert_beg( &head, 12 ) )
{
    puts( "There is no enough memory" );
}