【发布时间】:2012-01-19 20:29:41
【问题描述】:
我已经在 CSC 课程的实验室工作了一段时间,不幸的是我对 C 有点生疏(你可能会从代码中注意到)。我遇到了两个与内存管理有关的特殊问题。
1) 在出队操作中,我试图从队列末尾的节点返回一个字符串值。由于我还尝试使用 free() 并在检索数据后终止该节点,因此我需要使用 strcpy() 之类的方法来获取数据。每当我尝试使用 strcpy 时,程序就会出现段错误,并且 Valgrind 声称无效 r/w。
2) 由于我无法理解的原因,出队也没有正确更新 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的代码吗? -
已从您的评论中使用您的排队功能更新了我的答案。