任何人都知道这种重复功能有什么问题吗?它不会删除所有节点
struct contact
{
char FirstName[41];
char LastName[41];
int id;
struct contact *next;
};
void ClearList (struct contact *person)
{
struct contact *temp = person;
if (person == NULL) return;
else
{
person = person->next;
free(temp);
ClearList(person);
}
}
这是我的主要功能
void main()
{
struct contact *person = malloc(sizeof(struct contact));
strcpy (person->FirstName, "John");
strcpy (person->LastName, "Doe");
person->id = 10;
person->next = malloc(sizeof(struct contact));
strcpy (person->next->FirstName, "Will");
strcpy (person->next->LastName, "Smith");
person->next->id = 20;
person->next->next = NULL;
PrintList(person);
ClearList(person);
PrintList(person);
}
当我在调用ClearList后调用PrintList时,它仍会打印出一些杂乱的东西,我该如何解决这个问题呢?
答案 0 :(得分:4)
删除所有节点 ,但您永远不会清除任何指针。所以你正在做的是取消引用导致undefined behavior的无效指针。
free
函数不会自动设置指向NULL
的指针。
答案 1 :(得分:2)
我真的不喜欢你的链表上的递归删除。如果您的链接列表包含100个元素,那么您将在堆栈中深入了100个函数并且可能会崩溃。
我建议像这样重写:
void ClearList (struct contact *person)
{
while( person != NULL )
{
struct contact * temp = person
person = person->next;
free(temp);
}
}
约阿希姆有正确的答案。虽然我们已经清除了那个人所指向的记忆,但是#34; ClearList"没有权限将原始指针设置为NULL。所以要么你需要使ClearList采用双指针,所以它可以将指针设置为NULL,或者只是设置" person"调用ClearList后为NULL。
双指针示例,使用ClearList(& person)调用;
void ClearList (struct contact ** list)
{
struct contact *person = *list;
while( person != NULL )
{
struct contact * temp = person
person = person->next;
free(temp);
}
*list = NULL;
}