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つの要素が入力されるまで機能します(1つずつポップしてメモリを解放することでキューをクリアします)

ポップ:

// 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;
        }   
}

2つの要素がある場合に発生するエラーは、示されている行のセグメンテーション違反ですが、それ以上のキューでは機能します。myqueue-> head-> nextにNULLを割り当てさせないのはなぜですか?

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 に答える