Связанный список в c без ошибок (): ошибка недопустимого указателя ИЛИ ошибка сегментации

#c #memory-leaks

#c #утечки памяти

Вопрос:

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

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

 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:

Оператор free действительно бесполезен.

В этом заявлении:

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

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

 free(newNode);
  

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

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