c++ - 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;
}
解决方案
你的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
所有操作都作为成员函数来完善它。
推荐阅读
- vba - 在 VBA for Word 中获取保存的文件名
- wpf - 如何设置 ComboBox 的 ItemsSource,如果它存在于 ItemsCotrol 中
- c# - 在 UWP 应用程序中使用 Microsoft.bot.Connector.DirectLine
- javascript - 如何获取 toLocaleString() 方法的小数和千位分隔符?
- java - 在java中设置可读可写不起作用
- php - 在自定义最近帖子页面 Wordpress 上显示下一页/上一页按钮
- docusignapi - 如何通过 DocuSign API 获取文档的自定义字段?
- google-chrome - 从命令行打开 Chrome 跟踪查看器
- c# - 如何以更好的性能执行多个异步
- c# - CSS 元素遮挡了 Xpath 元素