2012-03-07 2 views
1

по какой-либо причине вызов моей функции «delAll» более одного раза приведет к неправильной ошибке от Valgrind. Я не понимаю, почему, если я называю эту функцию второй раз может вызвать программу снова войти в то время цикла, даже если это просто «delAll» узлаНедействительный бесплатный Valgrind

// р связанный список с вызовом

struct node{ 
char *str, int data, struct node *next; 
} 

// здесь функция У меня возникли проблемы с:

void delAll() 
{ 

struct node *temp,*temp2; 
temp=p; 
while(temp!=NULL) 
{ 

    temp2=temp; 
    temp= temp->next; 

    free(temp2->str); 
    free(temp2); 

} 

} 
+0

бесплатно не устанавливает значение null; в дополнение к 'free (temp2)' вы хотите добавить 'temp2 = NULL'. –

+0

o да, вы правы, спасибо! – user308553

ответ

1

p является указателем на свой список, и теперь он будет еще после точки delAll вызова к (free'd) начала списка. Я бы просто сделал;

p=NULL; 

... сразу после цикла while, чтобы установить p на нуль (т.е. правильно очистить список). Это предотвратит попытку вашего delAll снова освободить все элементы.

Конечно, это будет зависеть от p, а не только от временной переменной, я предполагаю, что это настоящий указатель «начало списка».

Смежные вопросы