我正在尝试创建队列库,当我实现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;
}
答案 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;
}