C++ 6999分段故障-C++;
这是我的代码:C++ 6999分段故障-C++;,c++,aws-cloud9,C++,Aws Cloud9,这是我的代码: #include <iostream> using namespace std; #define MAX 5 检查堆栈是否已满: bool isFull(int tmpTop){ return (tmpTop==(MAX-1)); } 检查堆栈是否为空: bool isEmpty(int tmpTop){ return (tmpTop==-1); } 将数据添加到堆栈中: void push(Stack *ptrStack, int n){
#include <iostream>
using namespace std;
#define MAX 5
检查堆栈是否已满:
bool isFull(int tmpTop){
return (tmpTop==(MAX-1));
}
检查堆栈是否为空:
bool isEmpty(int tmpTop){
return (tmpTop==-1);
}
将数据添加到堆栈中:
void push(Stack *ptrStack, int n){
if(isFull(ptrStack->top)){
cout<<"Stack is full! Push aborted!\n";
}else {
ptrStack->top++;
ptrStack->data[ptrStack->top]=n;
}
}
int pop(Stack *ptrStack){
int data = -1 ;
if(isEmpty(ptrStack->top)){
cout<<"Stack is empty! Pop is aborted!\n";
}else {
data=ptrStack->data[ptrStack->top];
ptrStack->top--;
}
return data;
}
显示堆栈:
int getSize(int tmpTop){
return tmpTop+1;
}
void displayStack(Stack tmpStack){
if(isEmpty(tmpStack.top)){
cout<<"Stack is empty! Displaystack is aborted!\n";
}else {
for(int i=0;i<=tmpStack.top;i++){
cout<<tmpStack.data[i]<<" ";
}
}
}
这是输出:
将您的
堆栈声明为:
struct Stack{
int data[MAX];
int top;
};
。。。并实例化为:
Stack aStack;
没有任何东西可以初始化堆栈
的值,因此您得到的值就是进程堆栈上的垃圾值。特别是,top
未初始化,用于访问数据
数组。这会导致你的seg故障
事实上,如果警告级别设置得足够高,编译器会发出警告。我得到警告:“aStack.Stack::top”在编译代码时在此函数中未初始化使用
即使top
被隐式初始化为零,就像在其他一些语言中发生的那样,这也是不正确的。代码使用top
的值-1表示空堆栈。你需要初始化它
一种方法是将构造函数添加到堆栈中
:
struct Stack{
int data[MAX];
int top;
Stack() : top(-1) {}
};
就我个人而言,我会使它成为一个完整的类
,所有操作都作为成员函数。我没有看到任何初始化堆栈
@fredrarson的东西。堆栈是在main方法中初始化的。不,不是。它已实例化,但未初始化。我添加了std::cout,使Stack
成为一个具有构造函数的类,并使所有堆栈操作成为成员函数。更好的办法是,使用。我支持弗雷德。并非所有东西都必须是面向对象的,但这甚至不是一种好的功能性风格。您需要将大小传递到isEmpty
、isFull
和getSize
以查询大小,这有点奇怪。这些函数没有封装任何东西,但可以隐藏bug。
Stack aStack;
struct Stack{
int data[MAX];
int top;
Stack() : top(-1) {}
};