[英]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.