从 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" );
}
一旦我们离开函数 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" );
}