В настоящее время я работаю над проектом по реализации двусвязного списка с узлами в виде структур, содержащих информацию MP3.Я считаю, что по большей части правильно реализовал структуру данных.Проблема, с которой я столкнулся, заключается в возможности, которую я пытаюсь реализовать.Особенность заключается в том, что пользователь вводит имя, которое будет использоваться для обхода списка, чтобы удалить все узлы, поля которых одинаковы.Проблема в том, что когда я это делаю, valgrind сообщает мне:
Недопустимое чтение размера 8.
Реализация структуры данных и очистка памяти при выходекажется, работает для меня, так как я никогда не получаю никаких утечек памяти или ошибок сегментации.Я только динамически распределяю структуру и два поля для узла и сначала освобождаю поля, а затем узел.Я также обнаружил, что эта проблема возникает только один раз, когда я вызываю функцию в первый раз.
//The struct
typedef struct mp3 {
char *name;
char *title;
int year;
int runtime;
struct mp3 *next;
struct mp3 *prev;
}mp3_t;
//The problematic function
void deleteArtist(mp3_t **head, mp3_t **tail){
mp3_t *current = *head;
int compareR;
printf("Please enter the name of the artist whose information you want deleted: \n");
char buffer[BUFFERSIZE];
int len;
if(fgets(buffer,BUFFERSIZE,stdin) != NULL){
len = (int) strlen(buffer);
buffer[len-1] = '\0';
}
while(current != NULL){
compareR = strcmp(current->name, buffer);
if(compareR == 0){
free(current->title);
free(current->name);
if(current->prev == NULL && current->next == NULL){
free(current);
*head = NULL;
*tail = NULL;
}
else if(current->prev == NULL){
current->next->prev = NULL;
*head = current->next;
free(current);
}
else if(current->next == NULL){
current->prev->next = NULL;
*tail = current->prev;
free(current);
}
else{
current->prev->next = current->next;
current->next->prev = current->prev;
free(current);
}
}
current = current->next;
}
}
Несмотря на то, что valgrind сообщает мне сообщение об ошибке, программа запускается так, как я ожидал, и это меня больше всего смущает.Мое первое предположение состоит в том, что я вызываю free()
на узле, который может не заполнить все его поля (?) Или что-то связанное с использованием двойного указателя.
Редактировать: Вот примертакая ошибка
==29909== Invalid read of size 8
==29909== at 0x400F11: deleteArtist (in /usa/tfessara/project1/mp3)
==29909== by 0x4011EB: main (in /usa/tfessara/project1/mp3)
==29909== Address 0x52048d8 is 24 bytes inside a block of size 40 free'd
==29909== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29909== by 0x400E3C: deleteArtist (in /usa/tfessara/project1/mp3)
==29909== by 0x4011EB: main (in /usa/tfessara/project1/mp3)
==29909== Block was alloc'd at
==29909== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29909== by 0x4009EC: makeNewMP3 (in /usa/tfessara/project1/mp3)
==29909== by 0x401191: main (in /usa/tfessara/project1/mp3)
==29909==