我有一个歌曲库链表,我正试图删除它,但当我测试它时,我的数据仍然存在,没有释放。
deleteAllNodes(head);
if (head == NULL)
printMusicLibraryEmpty();
我试着测试一下,如果我的头现在为NULL,我会打印我的空消息,但现在它没有打印,这意味着数据没有被擦除。
Node *deleteAllNodes(Node *head) {
while (head != NULL) {
Node *firstNode = head;
songNameDeleted(firstNode -> songName);
head = head -> link;
free(firstNode);
firstNode = NULL;
}
return NULL;
}
在您的调用函数中,head
仍然会指向第一个节点的内存位置,即使您的节点都已释放。要更改调用函数中的head
,您有两个选项:
1) 设置head = deleteAllNodes(head);
2) 将指针传递给head
,并将deleteAllNodes(Node *head)
更改为deleteAllNodes(Node **head)
。在函数中,您可以设置*head = NULL
。
要正确操作头,我们需要将指针传递给调用方的内存(指向头的指针),而不是它的副本。在调用函数时尝试Node*deleteAllNode(Node**head)和尝试deleteALLNode(&head)。
您应该使用以下解决方案之一:
-
通过引用传递var:
Node *deleteAllNodes(Node **head) { while (head != NULL) { Node *firstNode = *head; songNameDeleted(firstNode -> songName); *head = *head->link; free(firstNode); firstNode = NULL; } return NULL; }
函数调用:
deleteAllNodes(&head); //pass var by reference
if (head == NULL)
printMusicLibraryEmpty();
功能返回头值:
Node *deleteAllNodes(Node *head) { while (head != NULL) { Node *firstNode = head; songNameDeleted(firstNode -> songName); head = head -> link; free(firstNode); firstNode = NULL; } return head; }
函数调用:
head = deleteAllNodes(head); //value returned by function
if (head == NULL)
printMusicLibraryEmpty();