Как исправить ошибку valgrind «Недопустимое чтение размера 8» для двусвязного кода списка? - PullRequest
0 голосов
/ 21 сентября 2019

В настоящее время я работаю над проектом по реализации двусвязного списка с узлами в виде структур, содержащих информацию 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== 

1 Ответ

0 голосов
/ 21 сентября 2019

Эта проблема решена.Это было из-за свободного (текущего);... текущий = текущий-> следующий ;.вопрос, который указал -melponene.Спасибо!

...