【问题标题】:queue structure gives strange error队列结构给出了奇怪的错误
【发布时间】:2011-11-15 10:04:15
【问题描述】:

这是队列实现,它给了我非常不清楚的错误

#include<iostream>
#include "bool.h"
#include "item.h"
#include "queue.h"

using namespace std;

void init_queue(queue *q){
    q->first=0;
    q->last=queuesize-1;
    q->count=0;

}
       void enqueue (queue *q,item_type x){
           if(q->count>=queuesize)
               cout<<" queue everflow occurs during enqueue "<<endl;
           else
           {
               q->last=(q->last+1)%queuesize;
               q->m[q->last]=x;
               q->count=q->count+1;

           }




       }

             int dequeue (queue *q)
             {
                 item_type x;
                 if(q->count<=0) cout<<"empthy queue "<<endl;
                 else
                 {
                     x=q->m[q->first];
                     q->first=(q->first+1)%queuesize;
                     q->count=q->count-1;
                 }
                 return (x);




                 }



             item_type headq(queue *q)
             {
                 return(q->m[q->first]);
             }
             int empthy(queue *q){


                 if (q->count<=0) return (TRUE);
                 else return (FALSE);
             }

 void print_queue(queue *q){
     int i;
     i=q->first;
     while(i!=q->last)
     {
         cout<<q->m[i];
         i=(i+1)%queuesize;
     }
     cout<<q->m[i]<<"  ";

 }
 int main(){
     queue *q;
     init_queue(q);
 int a;
 while(cin>>a){
     enqueue(q,a);




 }
 print_queue(q);


    return 0;
}

另请参阅队列头文件

#define  queuesize 1000
#include "item.h"

typedef struct
{
int  m[queuesize+1];
  int first;
  int last;
  int count;
  }queue;

错误是(实际上)它不是错误,只是在我编译时发出警告,但是当我运行时它说局部变量 q 未初始化,所以哪个变量 q?它是结构的名称,所以当我运行 init_queue 方法时它应该初始化是吗?

【问题讨论】:

  • 如果你在linux上,你可以使用valgrind获取详细信息。

标签: c++ data-structures queue


【解决方案1】:

您必须实例化队列对象。

int main(){
 queue *q = new queue;
 init_queue(q);

使用 q 作为堆栈变量并传递地址。

int main(){
 queue q;
 init_queue(&q);

【讨论】:

    【解决方案2】:

    问题出在这两行代码。

     queue *q;
     init_queue(q);
    

    init_queue 内部,您假设q 通过使用-&gt; 运算符取消引用它分配了一些内存。但它只是一个指向内存中随机地址的指针(因为它还没有被初始化)。

    q->first=0;
    q->last=queuesize-1;
    q->count=0;
    

    要解决这个问题,您应该添加一些类似的内容

    queue *q = new queue();
    

    但是,由于您使用的是 C++,因此可能值得构建一个类来封装构造函数中的内存分配并释放析构函数中的内存。

    更好的是遵循 rageshctech 的建议,完全避免使用手动内存分配,而只使用在堆栈上分配的东西(例如,没有指针)。

    【讨论】:

      【解决方案3】:
       queue *q;      
      init_queue(q); 
      

      你没有为 q 分配内存。

      队列 *q = 新队列;

      您也可以在堆栈上分配队列:(推荐!)

      queue q;
         init_queue(&q); 
      

      【讨论】:

        【解决方案4】:

        它是结构的名称

        不,q 是指向queue 对象的指针。在main 中,您没有为q 分配任何值,甚至还没有创建它可以指向的queue 对象。所以q 是未初始化的。

        你应该这样做:

        queue q;          // an instance of queue
        queue *qptr = &q; // a pointer to that instance
        // now use qptr (or &q) in place of q in the rest of the main function.
        

        【讨论】:

          【解决方案5】:

          我猜这个警告是关于main 中的变量q?这是因为您将其定义为指针,但不分配它。要么将其定义为非指针,并在所有函数调用中使用&amp;q,要么为其分配内存:

          queue *q = new queue;
          

          main 中的return 0 之前释放内存:

          delete q;
          

          【讨论】:

            【解决方案6】:

            您从未为队列分配内存。

            用非默认构造函数创建一个类,而不是指针,然后使用它。

            指针是 C 的东西。您正在使用 C++ 进行编码:P

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-02-18
              • 1970-01-01
              • 2017-02-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多