我正在使用双链表,我遇到了pop()函数的问题。
//QueueElement describe the block in the cache
typedef struct _queue_ele_
{
char *content; //the data of the block
struct _queue_ele_ *prev;
struct _queue_ele_ *next;
}QueueElement;
typedef struct _queue_
{
int queue_len;
int max_queue_size;
QueueElement *head;
QueueElement *tail;
}MyQueue;
pop函数一直有效,直到输入2个元素(我通过逐个弹出并释放内存来清除队列)
流行:
// head is removed and returned
QueueElement* pop(MyQueue* myqueue)
{
// if empty
if(myqueue->queue_len == 0) return NULL;
QueueElement *p = myqueue->head;
// if one element
if(myqueue->queue_len == 1)
{
myqueue->queue_len--;
myqueue->head = NULL;
myqueue->tail = NULL;
return p;
}
else
{
myqueue->queue_len--;
//remove the head from the queue
myqueue->head = myqueue->head->prev;
myqueue->head->next = NULL; //******************Seg Fault here
p->prev = NULL;
return p;
}
}
当有两个元素时我得到的错误是显示的行中的分段错误,但它适用于具有更多元素的队列。为什么不让它给myqueue-> head-> next ???
分配NULL答案 0 :(得分:4)
改变这个:
myqueue->head = myqueue->head->prev;
myqueue->head->next = NULL; //******************Seg Fault here
要:
myqueue->head = myqueue->head->prev;
if (myqueue->head != NULL) {
myqueue->head->next = NULL;
}
您可能正在尝试取消引用NULL指针。您可能会因为在要删除的节点上没有调用free而导致内存泄漏,但您可以在代码中的其他地方执行此操作。