内存弹出漏洞()为队列中的pop()

时间:2017-03-31 22:07:02

标签: c memory-leaks

我的 pop 功能似乎无法正常工作。基本上,我的队列有一个指向第一个和最后一个元素的指针。

我的 pop 函数首先释放第一个元素并将其指定为 NULL

然后它使用指针 curr 每次都到达下一个元素,直到找到 NULL

最后,我队列中的第一个指针被分配给上一页,指向 curr 达到null之前的最后一个元素。

#include <stdlib.h>

struct Queue {
    struct Node* first;
    struct Node* last;
};

struct Node {
    Item val;
    struct Node* next;
};


void initQueue (struct Queue **queue){
    (*queue) = malloc(sizeof(struct Queue));
    (*queue)->first = NULL;
    (*queue)->last = NULL;
}

struct Node* createNewNode(){
    struct Node *newNode;
    newNode = malloc(sizeof(struct Node));
    newNode->next = NULL;

    return newNode;
}



void push (Item val, struct Queue *queue){
    struct Node* newNode = createNewNode();
    newNode->val = val;


    if(queue->first == NULL){
        queue->first = newNode;
        queue->last = newNode;
    }

    else{
        newNode->next = queue->last;
        queue->last = newNode;
    }
}

void pop(struct Queue *queue){

    struct Node* curr = queue->last;
    struct Node* prev = queue->last;


    free(queue->first);
    queue->first = NULL;

    while(curr != NULL){
        prev = curr;
        curr = curr->next;
    }

    queue->first = prev;

}

1 个答案:

答案 0 :(得分:2)

要从列表的正面弹出,只需将first指向first->next即可。

void pop(struct Queue *queue)
{
    if (NULL != queue->first) {
        struct Node *first = queue->first;
        // Update first ptr
        queue->first = queue->first->next;
        free(first);
        // Only need to update tail if list is empty
        if (NULL == queue->first) {
            queue->last = NULL;
        }
    }
}

修改 根据你的评论看起来你看不到我在做什么,所以这是一个例子。

假设队列如下所示:

queue->first

A→B→C→D←queue->last

首先,制作一个临时指针,并指向queue->first。然后移动queue->first,使其指向queue->first->next。该列表现在看起来像:

queue->first

A→B→C→D←queue->last

first(临时变量)

然后,删除temp var,列表为:

queue->first

B→C→D←queue->last

编辑2 我还注意到您的push功能不正确。在队列中,您将新项目添加到列表的末尾并从前面获取项目(FIFO - 先进先出)。喜欢排队看节目的人。 第一个到达那里并排队的人将是第一个进入剧院的人。并且最后的人到达后面。所以push应该是:

void push (Item val, struct Queue *queue){
    struct Node* newNode = createNewNode();
    newNode->val = val;

    if(queue->first == NULL) {
        queue->first = newNode;
        queue->last = newNode;
    }
    else{
        queue->last->next = newNode;  // Add to END of list
        queue->last = newNode;
    }
}