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