Когда вы освобождаете человека, вы не устанавливаете указатель next_person
предыдущего человека на NULL
.Следовательно, он указывает на освобождаемую память, и поэтому вы дважды освобождаете.
Вам нужно будет отследить, кто пришел, прямо перед тем, кого вы хотите освободить, и установить указатель next_person
на NULL
.
Другим более эффективным способом написания вашего цикла будет следующий, который не подвержен той же ошибке:
// Grab the first person
cur_person = person_list.first_person;
// Make sure there is someone to free
while (cur_person != NULL) {
// Keep track of who to free next
nxt_person = cur_person->next_person;
free_person(cur_person);
// Get the next person in line
cur_person = nxt_person;
}
// Didn't we just remove them all? Yes, we did.
person_list.num_persons = 0;
// Let's not forget to set that we have no one left
person_list.first_person = NULL;