【问题标题】:Exception thrown when using dequeue method from queue [duplicate]使用队列中的出队方法时引发异常[重复]
【发布时间】:2018-05-27 06:31:15
【问题描述】:

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

【问题讨论】:

  • 在您未显示的代码中某处存在错误。您需要显示minimal reproducible example。顺便说一句:在 C 中参数是按值传递的,所以如果你调用 xyz = dequeue(somequeue); 那么 somequeue 将不会被修改。这可能是你的问题。

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


【解决方案1】:
 int dequeue(queue q)
 {
   queue fi = q;

您通过值传递q,因此即使您使q 指向dequeue() 内、dequeue() 外的下一个元素,它仍然指向已释放的内存并且使用q 会崩溃。

将指向q 的指针传递给dequeue

【讨论】:

    【解决方案2】:

    首先声明此声明

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

    【讨论】:

    • 是的,我不敢相信我不记得了,谢谢。为什么结构的第一个声明无效?
    • @Matthew 它声明了两种不同的结构。第一个未命名,第二个不完整。编译器至少应该为这条语句发出诊断消息 q = q->next;
    • 我明白了,谢谢!
    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多