[英]How do I access a null pointer (node) of a linked list?
这个方法应该是把 append 一个 Node 放在一个链表的末尾。 该方法循环直到到达末尾,即 null 指针。 但是当我尝试将 null 指针更改为一个值时,它会崩溃。 我应该如何解决这个问题? (Node 指针有一个 integer 数据和当前 Node 指向的另一个 Node 变量)。
void appendItem(LinkedList* list, int value)
{
Node* temp = (Node*)malloc(sizeof(Node));
temp = list->head;
while(temp != NULL)
{
temp = temp->next;
}
temp->data = value;
temp->next = NULL;
}
禁止取消引用NULL
。
取而代之的是,您应该管理指向应该更改的内容的指针。
另请注意,通过malloc()
分配一些缓冲区并在其后用另一个值覆盖结果会导致 memory 泄漏。
还有一点是malloc()
系列的强制转换结果被认为是一种不好的做法。
固定代码:
void appendItem(LinkedList* list, int value)
{
Node** temp = &list->head;
while(*temp != NULL)
{
temp = &(*temp)->next;
}
*temp = malloc(sizeof(Node));
if (*temp != NULL)
{
(*temp)->data = value;
(*temp)->next = NULL;
}
}
这些行
Node* temp = (Node*)malloc(sizeof(Node));
temp = list->head;
产生 memory 泄漏。 首先分配了 memory 并将其地址存储在指针temp
中,然后指针temp
的值被表达式list->head
的值覆盖。 结果,分配的 memory 的地址丢失了。
在这个循环之后
while(temp != NULL)
{
temp = temp->next;
}
指针temp
等于NULL
。 因此在这些语句中使用 null 指针来访问 memory
temp->data = value;
temp->next = NULL;
调用未定义的行为。
例如,function 可以通过以下方式定义。
int appendItem( LinkedList *list, int value )
{
Node *new_node = malloc( sizeof( Node ) );
int success = new_node != NULL;
if ( success )
{
new_node->data = value;
new_node->next = NULL;
if ( list->head == NULL )
{
list->head = new_node;
}
else
{
Node *current = list->head;
while ( current->next != NULL ) current = current->next;
current->next = new_node;
}
}
return success;
}
请注意,memory 分配可能会失败。 您需要在 function 中处理这种情况。 function 的调用者应该被告知这种情况。
此外,当您允许 append 将新节点添加到单链表时,该列表应定义为双边单链表。 也就是说,列表应该保留两个指针:一个指向头节点的指针,另一个指向尾节点的指针。 否则将节点附加到列表将是低效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.