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