Я некоторое время работал над лабораторией для класса CSC, и, к сожалению, я немного ржав с C (как вы, вероятно, заметите из код). Я сталкиваюсь с двумя конкретными проблемами, связанными с управлением памятью.Попытка вернуть строку из очереди в C/бесплатные проблемы
1) В операции dequeue я пытаюсь вернуть строковое значение из узла в конце очереди. Поскольку я также пытаюсь использовать free() и убивать этот узел после получения данных, мне нужно использовать метод strcpy() для захвата данных. Программа segfaults всякий раз, когда я пытаюсь использовать strcpy, и Valgrind утверждает недопустимый r/w.
2) dequeue также неправильно обновляет структуру stringQueue по причинам, которые я не могу понять. У меня есть аналогичный код для стеков, где изменения сохраняются, но я могу продолжать выполнять деактивацию весь день, и он фактически не удалит конечный узел.
Соответствующий код:
typedef struct node {
char data [strMax];
struct node * next;
} queueNode;
typedef struct {
queueNode * head;
queueNode * tail;
} stringQueue;
char * dequeue(stringQueue *queue) {
char * data = malloc(strMax * sizeof(char));
if(empty(*queue)) {
return "Null list!";
}
else if(!(queue->head)->next) { // One item in the queue.
data = (queue->head)->data;
//free(queue->head);
queue->head = NULL;
queue->tail = NULL;
}
else { // Multiple items in the queue.
data = (queue->tail)->data;
free(queue->tail);
queueNode * trace = queue->head;
while(trace->next) // Seek the last node in the queue.
trace = trace->next;
queue->tail = trace;
}
return data;
}
Можете ли вы опубликовать код, создающий 'queueNode'? – hmjd
Обновите свой ответ своей функцией очередей из вашего комментария. –