Связанный список в c ошибка - free (): неверный указатель ошибка или ошибка сегментации - PullRequest
0 голосов
/ 27 марта 2019

Я создаю связанный список в c и не могу добавить другой узел после 4-го.Когда я использую free (node), я получаю ошибку: free (): неверный указатель Aborted (core dumped). Однако, если я удаляю объявление free (node), я получаю ошибку сегментации.Я предполагаю, что это какая-то проблема с памятью, но я не могу найти источник проблемы.

Используемые структуры:

struct node
{
    int id;
    struct process * p;
    struct node * next;
};

struct queue
{
    struct node * head;
    struct node * tail;
};

Функция постановки в очередь, которая должна добавитьузел к списку:

void enqueue(struct queue * q, struct node * newNode)
{
    if(q->tail == NULL)
    {
        q->head = q->tail = newNode;
        return;
    }

    q->tail = q->tail->next = newNode;

    // free statement useful?
    free(newNode);
}

1 Ответ

3 голосов
/ 27 марта 2019

Свободное утверждение действительно бесполезно.

В этом утверждении:

q->tail = q->tail->next = newNode;

Вы назначаете указатель newnode двум переменным указателя. Но в следующем утверждении

free(newNode);

вы делаете этот указатель недействительным, поэтому разыменование (или освобождение) указателей, хранящихся в q->tail, и следующий указатель второго-последнего элемента вашего списка приводит к неопределенному поведению.

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

...