从队列中使用dequeue方法时抛出异常

时间:2017-12-13 11:22:30

标签: c pointers linked-list queue singly-linked-list

我正在尝试创建队列库,当我实现dequeue方法时,抛出异常" 0xC0000374:堆已损坏(参数:0x77475910)。"这只是在我已经从队列中删除一个项目之后才被抛出,该项目被成功返回但是第一个元素没有被删除,这是我编写代码的方式:

typedef struct {
   int value;
   struct queue_item * next;
} queue_item;
typedef queue_item * queue;

这是方法:

int dequeue(queue q)
{
    queue fi = q;
    int value = q->value;
    fi = q;
    q = q->next;
    free(fi);
    return  value;
}

2 个答案:

答案 0 :(得分:2)

 int dequeue(queue q)
 {
   queue fi = q;

您按值传递q,因此即使您q指向dequeue()dequeue()内的下一个元素,它仍指向已释放的内存并使用{ {1}}会崩溃。

将指针q传递给q

答案 1 :(得分:1)

对于初学者来说这个宣言

typedef struct {
   int value;
   struct queue_item * next;
} queue_item;

无效。

应该看起来像

typedef struct queue_item {
   int value;
   struct queue_item * next;
} queue_item;

函数dequeue处理原始队列指针的副本,因为它是按值传递给函数的。

所以函数中的这个语句

q = q->next;

不会更改原始指针。

您应该通过引用传递指针。例如

int dequeue(queue *q)
{
    queue fi = *q;
    int value = ( *q )->value;

    *q = ( *q )->next;
    free( fi );

    return  value;
}