У меня возникли трудности с обнаружением ошибки сегментации в бит кода для проекта класса (эта часть неклассифицирована). Я реализую очередь для класса ОС, и у меня возникают проблемы с ошибкой сегментации в функции добавления.C Ошибка сегментации программы
void AddQueue(QElem * head, QElem * item) {
printf("WHERE\n");
if(head == NULL){
printf("THE\n");
head = item;
//item->next = item;
//item->prev = item;
}
else{
printf("$^&*\n");
(head->prev)->next = item;
printf("ARE\n");
item->prev = (head->prev);
printf("YOU\n");
item->next = head;
printf("FAILING\n");
head->prev = item;
}
printf("!?!?!?\n");
}
У меня есть функция тест, который я звоню из другого класса ...
void TestAddQueue()
{
printf("********************************************\n");
printf("Begin testing the add test function\n");
printf("********************************************\n");
QElem * queue;
InitQueue(queue);
for(int i = 0; i < 10; i++)
{
printf("Adding element %d\n", i+1);
QElem * newElem = NewItem();
printf("Changing payload value\n");
newElem->payload = i+100;
printf("Adding to the queue\n");
AddQueue(queue, newElem);
printf("Item added, payload value = %d\n", queue->payload);
printf("The previous payload = %d\n", queue->prev->payload);
}
for(int i = 0; i < 10; i++)
{
printf("Rotating list", i+1);
RotateQ(queue);
printf("Printing element %d\n", i+1);
printQElem(queue);
}
}
Вот функция NewItem ...
QElem * NewItem()
{
// just return a new QElem struct pointer on the heap
QElem * newItem = calloc(1,sizeof(QElem));
newItem->next = newItem;
newItem->prev = newItem;
newItem->payload = -1;
return newItem;
}
... и здесь является результатом работы программы ...
********************************************
Begin testing the add test function
********************************************
Adding element 1
Changing payload value
Adding to the queue
WHERE
THE
!?!?!?
Segmentation fault
Теперь указатель на голову, который передается в функцию добавления, должен быть NULL, поскольку он отправляется в функцию инициализатора, которая просто устанавливает значение указателя в NULL, поэтому я не думаю, что это вызовет мою проблему.
Я думаю, что следующая строка является один вызывает вопрос ...
printf("Item added, payload value = %d\n", queue->payload);
Вероятно, когда я пытаюсь получить значение полезной нагрузки, либо структура Я пытаюсь получить доступ, не существует больше или так как указатель очереди был перемещен в недопустимое пространство. Любая оценка или подталкивание в правильном направлении были бы оценены.
Боковое примечание: это компилируется в среде Unix-сервера (bash), и на данный момент у меня нет доступа к среде IDE для отладки и просмотра переменных.
Там много кода отсутствует в вашем примере; например, NewItem(). Тем не менее, я говорю: посмотрите на строку «(head-> prev) -> next» в AddItem: вы проверили, что «голова» не является NULL, но не проверила, что «head-> prev» - NULL – haavee