堆栈中推送操作中的逻辑错误

时间:2015-03-23 12:53:09

标签: c arrays data-structures struct 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");
}

2 个答案:

答案 0 :(得分:1)

根据您目前的代码,您似乎未使用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增量部分。

答案 1 :(得分:1)

看起来你只是定义了一个struct Stack类型的指针,但没有分配堆栈本身

stack *s;

因此s等于NULL。至少你应该自己分配堆栈。例如

stack *s;

//...
s = malloc( sizeof( struct Stack ) );

但无论如何也没有必要定义指针。您可以定义堆栈本身。例如

stack s;

Aldo您需要设置数据成员的初始值top。我想你可以用-1初始化它。

此外,功能插入本身也无效。

void push(int x)
{
  s->top++;
  if(s->top<=19){
  s->elements[s->top]=x;}
  else
    puts("Overflow");
}

每次调用该函数时,即使数据成员已经超出数组,它也会增加数据成员。有效函数可能看起来像

void push(int x)
{
   if ( s->top + 1 < 20)
   {
      s->elements[++s->top] = x;
   }
   else
   [
       puts("Overflow");
   }
}