入栈操作逻辑错误
Logical error in push operation in stack
我正在将堆栈作为数组进行插入操作,但我的程序在输入第一个值时崩溃。
typedef struct Stack
{
int top;
int elements[20];
}
stack;
stack *s;
void push(int x)
{
s->top++;
if(s->top<=19){
s->elements[s->top]=x;}
else
puts("Overflow");
}
根据您目前的代码,您使用的似乎是 s
未初始化的。使用单元化内存调用 undefined behaviour 反过来 可能 导致分段错误。
为了防止单元化 s
,您可能需要像
这样修改您的代码
void push(int x)
{
if (s) //check if `s` has been initialized.
{
s->top++;
if(s->top<=19)
{
s->elements[s->top]=x;
}
else
puts("Overflow");
}
else
//abort, return error or something similar
}
注意:
除了这里手头的问题,还有一个隐藏的问题,一旦你解决了这个问题就会出现。
在您的 push()
函数中,您 top
值 无条件地增加 。这意味着,即使堆栈已满,您的 top
值也会增加,稍后会导致错误计算。
你必须移动堆栈 top
增量部分也在值范围检查下。
看来你只是简单地定义了一个struct Stack类型的指针,而没有分配堆栈本身
stack *s;
因此s等于NULL。至少你应该自己分配堆栈。例如
stack *s;
//...
s = malloc( sizeof( struct Stack ) );
但无论如何都没有必要定义指针。您可以定义堆栈本身。例如
stack s;
您是否需要设置数据成员top的初始值。我想你可以用 -1.
初始化它
另外函数insert本身也是无效的。
void push(int x)
{
s->top++;
if(s->top<=19){
s->elements[s->top]=x;}
else
puts("Overflow");
}
每次调用该函数时,它都会增加数据成员 top,即使它已指向数组之外。有效函数可能看起来像
void push(int x)
{
if ( s->top + 1 < 20)
{
s->elements[++s->top] = x;
}
else
[
puts("Overflow");
}
}
我正在将堆栈作为数组进行插入操作,但我的程序在输入第一个值时崩溃。
typedef struct Stack
{
int top;
int elements[20];
}
stack;
stack *s;
void push(int x)
{
s->top++;
if(s->top<=19){
s->elements[s->top]=x;}
else
puts("Overflow");
}
根据您目前的代码,您使用的似乎是 s
未初始化的。使用单元化内存调用 undefined behaviour 反过来 可能 导致分段错误。
为了防止单元化 s
,您可能需要像
void push(int x)
{
if (s) //check if `s` has been initialized.
{
s->top++;
if(s->top<=19)
{
s->elements[s->top]=x;
}
else
puts("Overflow");
}
else
//abort, return error or something similar
}
注意:
除了这里手头的问题,还有一个隐藏的问题,一旦你解决了这个问题就会出现。
在您的 push()
函数中,您 top
值 无条件地增加 。这意味着,即使堆栈已满,您的 top
值也会增加,稍后会导致错误计算。
你必须移动堆栈 top
增量部分也在值范围检查下。
看来你只是简单地定义了一个struct Stack类型的指针,而没有分配堆栈本身
stack *s;
因此s等于NULL。至少你应该自己分配堆栈。例如
stack *s;
//...
s = malloc( sizeof( struct Stack ) );
但无论如何都没有必要定义指针。您可以定义堆栈本身。例如
stack s;
您是否需要设置数据成员top的初始值。我想你可以用 -1.
初始化它另外函数insert本身也是无效的。
void push(int x)
{
s->top++;
if(s->top<=19){
s->elements[s->top]=x;}
else
puts("Overflow");
}
每次调用该函数时,它都会增加数据成员 top,即使它已指向数组之外。有效函数可能看起来像
void push(int x)
{
if ( s->top + 1 < 20)
{
s->elements[++s->top] = x;
}
else
[
puts("Overflow");
}
}