首页 > 解决方案 > 6999 分段错误 - C++

问题描述

这是我的代码:

#include <iostream>
using namespace std;
#define MAX 5 

结构定义:

struct Stack{
    int data[MAX];
    int top;
};

检查堆栈是否已满:

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 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]<<" ";
        }
    }
}

返回堆栈中的值:

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 main(){
    Stack aStack;
    push(&aStack,11);
    push(&aStack,22);
    push(&aStack,33);
    displayStack(aStack);
    return 0;
}

这是输出: 在此处输入图像描述

标签: c++aws-cloud9

解决方案


你的Stack声明为:

struct Stack{
    int data[MAX];
    int top;
};

...并实例化为:

Stack aStack;

没有任何东西可以初始化 的值Stack,因此您获得的值是进程堆栈上发生的任何垃圾。特别top是未初始化并用于访问data数组。这会导致您的段错误。

事实上,如果警告级别设置得足够高,编译器就会对此发出警告。我warning: 'aStack.Stack::top' is used uninitialized in this function在编译你的代码时得到。

即使top隐式初始化为零,就像在其他一些语言中发生的那样,这也是不正确的。您的代码使用值 -1top表示空堆栈。你需要初始化它。

一种方法是将构造函数添加到Stack

struct Stack{
    int data[MAX];
    int top;

    Stack() : top(-1) {}
};

就个人而言,我会将class所有操作都作为成员函数来完善它。


推荐阅读