C++ 队列结构给出了奇怪的错误

C++ 队列结构给出了奇怪的错误,c++,data-structures,queue,C++,Data Structures,Queue,下面是队列实现,它给了我一个非常不清楚的错误 #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 *

下面是队列实现,它给了我一个非常不清楚的错误

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

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

问题在于这两行代码

 queue *q;
 init_queue(q);
init_queue
中,您假设
q
通过使用
->
操作符取消引用,为其分配了一些内存。但它只是指向内存中随机地址的指针(因为它尚未初始化)

要解决这个问题,您应该添加以下内容

queue *q = new queue();

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


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

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

queue *q = new queue;
main
中返回0之前,释放内存:

delete q;
这是结构的名称

否,
q
是指向-
队列
对象的指针。在
main
中,您没有为
q
分配任何值,甚至还没有创建它可以指向的
队列
对象。因此
q
未初始化

q->first=0;
q->last=queuesize-1;
q->count=0;
您应该这样做:

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.

必须实例化队列对象

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

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

int main(){
 queue q;
 init_queue(&q);
您没有为q分配内存

队列*q=新队列

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


您从未为队列分配内存

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


指针是C的东西。你在C++中编码:P/P>如果你在Linux上,你可以用来获取详细信息。
int main(){
 queue q;
 init_queue(&q);
 queue *q;      
init_queue(q); 
queue q;
   init_queue(&q);