1

我正在使用双链表,但我的 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;
        }   
}

当有两个元素时我得到的错误是显示的行中的分段错误,但它适用于更多的队列。为什么不让我将 NULL 分配给 myqueue->head->next ???

4

1 回答 1

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 而导致内存泄漏,但您可能会在代码的其他地方这样做。

于 2012-10-01T07:55:04.710 回答