为什么我们在插入链表时不使用 free(node)?
Why don't we use free(node) when inserting in a linked list?
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 而我们不再使用它了?
此处不能free(newnode);
,因为新节点已添加到列表中,因此稍后会用到。
此外,变量 newnode
本身(通常)分配在堆栈上,并在退出函数时自动释放,因此您不需要多次释放它。
如果您将释放指针 newnode
指向的节点,那么由于此语句
,指针 *head
*head=newnode;
将指向已删除的节点。结果指针 *head
将无效。
就是在这条语句之后
*head=newnode;
两个指针*head
和newnode
指向同一个节点。如果你会写
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;
}
在那种情况下,当没有足够的内存来分配新节点时,函数将不会有未定义的行为。并且函数的使用者可以查看是否添加新节点成功。
因为*head 指的是死者newnode
。您必须在代码末尾释放它们。
实际上,您不需要将 head
作为双指针。
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 而我们不再使用它了?
此处不能free(newnode);
,因为新节点已添加到列表中,因此稍后会用到。
此外,变量 newnode
本身(通常)分配在堆栈上,并在退出函数时自动释放,因此您不需要多次释放它。
如果您将释放指针 newnode
指向的节点,那么由于此语句
*head
*head=newnode;
将指向已删除的节点。结果指针 *head
将无效。
就是在这条语句之后
*head=newnode;
两个指针*head
和newnode
指向同一个节点。如果你会写
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;
}
在那种情况下,当没有足够的内存来分配新节点时,函数将不会有未定义的行为。并且函数的使用者可以查看是否添加新节点成功。
因为*head 指的是死者newnode
。您必须在代码末尾释放它们。
实际上,您不需要将 head
作为双指针。