weico 发表于 2017-4-27 19:29:55

学习栈的时候编译不报错,运行的时候停止工作了

本帖最后由 weico 于 2017-4-27 19:48 编辑

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define STACK_INIT_SIZE 20
#define STACK_INCREMENT 10

typedef char ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if( !s->base)
    {
      exit(0);
    }
    s->base = s->top;
    s->stackSize = STACK_INIT_SIZE;

}

void Push (sqStack *s, ElemType e)
{
    if( s->top - s->base >= s->stackSize )
    {
      s->base = (ElemType *)realloc(s->base,(s->stackSize*STACK_INCREMENT) * sizeof(ElemType));
      if( !s->base )
      {
            exit(0);
      }
    }

    *(s->top) = e;
    s->top++;

}

void Pop (sqStack *s,ElemType *e)
{
    if( s->base == s->top)
    {
      return;
    }
    *e = *--(s->top);

}

int StackLen(sqStack s)
{
   return (s.top - s.base);
}
int main()
{
   ElemType c;
   sqStack s1;
   sqStack s2;
   int len,i,j,sum = 0;
   InitStack(&s1);

   printf("请输入一个二进制数,以#结束!\n");
   scanf("%c",&c);
   while(c != '#')
   {

       Push(&s1,c);
       scanf("%c",&c);
   }
   InitStack(&s2);
   getchar();//把回车字符从键盘缓冲区去掉
   len = StackLen(s1);
   printf("二进制数栈的当前容量为:%d\n",len);
   for(i = 0;i < len;i += 3)
   {

       for(j =0;j<3;j++)
       {
         Pop(&s1,&c);
         sum += (c-48) * pow(2,j);
         if(s1.base == s1.top)
         {
               break;
         }
       }
       Push(&s2,sum + 48);
       sum = 0;
   }

   printf("转换的八进制数是");
   while(s2.base != s2.top)
   {
       Pop(&s2,&c);
       printf("%c",c);
   }
    printf("\n");
    return 0;
}
在学习利用栈进行进制转换的时候,按照甲鱼各的方法写的二进制转换为十进制没问题,自己动手写的时候停止服务了,利用调试功能 报这个错误Program received signal SIGSEGV, Segmentation fault. 调试时到push函数,就是压栈的时候出问题,网上的答案说是对空指针进行了操作,可是我没改过压栈的代码啊,压栈代码和甲鱼哥的二进制转十进制是一样的,为什么报这个错误呢,弄了好久了,麻烦大家帮忙解决一下!!

weico 发表于 2017-4-27 21:00:24

终于弄清楚了,是因为初始化栈的时候写的是底指针base等于头指针top,逻辑错误,罪过呀,正确的写法是 s->top = s->base;
页: [1]
查看完整版本: 学习栈的时候编译不报错,运行的时候停止工作了