Сбой двойного связанного списка после добавления узла - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь получить двойной связанный список, используя C, и сталкиваюсь с cra sh всякий раз, когда я пытаюсь добавить третий узел в свой список. Я нашел строку в своем коде, в которой моя программа падает, но я не могу понять, почему, поскольку код выглядит «безопасным». Я не получил никаких предупреждений или ошибок от компилятора. Если кто-нибудь сможет объяснить возможную ошибку указателя или причину, стоящую за cra sh, это будет высоко оценено. Любые вопросы или проблемы, связанные с моим кодом, будут даны ответы, как только я их увижу.

struct node *appendNode(struct node *headRef, unsigned short int newData) {
     struct node *newNode = (struct node*)malloc(sizeof(struct node*));
     newNode->data = newData;
     newNode->next = NULL;
     if(headRef == NULL) { //list is empty and returns the newNode to become the head pointer
         newNode->previous = NULL;
         return newNode;
     } else { //list is not empty and newNode is appended to end of list ----(Area of crash)----
         struct node *current = headRef;
         while(current->next != NULL) {
             current = current->next;
         }
         current->next = newNode;
         newNode->previous = current;
         return headRef;
     }       //----------------------------------------------------------------------------------
 };

Код, представленный выше, является функцией, которая добавляет новый узел в список. По завершении он возвращает новый адрес или тот же адрес, чтобы обновить указатель заголовка, используемый в 'main'. Код работает функционально всякий раз, когда я добавляю первые два узла, но вылетает всякий раз, когда он пытается добавить третий узел.

1 Ответ

1 голос
/ 23 марта 2020

Объем выделяемой памяти - это размер указателя на a struct node, а не фактический размер struct node, который вам нужен.

Итак должно быть

struct node *newNode = (struct node*)malloc(sizeof(struct node));

В результате выделения недостаточной памяти ваша программа записывает данные вне выделенного блока памяти, что вызывает неопределенное поведение . Это означает, что все может случиться. Например, программа может выполнить sh немедленно, не сразу или позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...