鱼C论坛

 找回密码
 立即注册
查看: 2890|回复: 1

[已解决]学习栈的时候编译不报错,运行的时候停止工作了

[复制链接]
发表于 2017-4-27 19:29:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 weico 于 2017-4-27 19:48 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. #define STACK_INIT_SIZE 20
  5. #define STACK_INCREMENT 10

  6. typedef char ElemType;
  7. typedef struct
  8. {
  9.     ElemType *base;
  10.     ElemType *top;
  11.     int stackSize;
  12. }sqStack;

  13. void InitStack(sqStack *s)
  14. {
  15.     s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  16.     if( !s->base)
  17.     {
  18.         exit(0);
  19.     }
  20.     s->base = s->top;
  21.     s->stackSize = STACK_INIT_SIZE;

  22. }

  23. void Push (sqStack *s, ElemType e)
  24. {
  25.     if( s->top - s->base >= s->stackSize )
  26.     {
  27.         s->base = (ElemType *)realloc(s->base,(s->stackSize*STACK_INCREMENT) * sizeof(ElemType));
  28.         if( !s->base )
  29.         {
  30.             exit(0);
  31.         }
  32.     }

  33.     *(s->top) = e;
  34.     s->top++;

  35. }

  36. void Pop (sqStack *s,ElemType *e)
  37. {
  38.     if( s->base == s->top)
  39.     {
  40.         return;
  41.     }
  42.     *e = *--(s->top);

  43. }

  44. int StackLen(sqStack s)
  45. {
  46.    return (s.top - s.base);
  47. }
  48. int main()
  49. {
  50.    ElemType c;
  51.    sqStack s1;
  52.    sqStack s2;
  53.    int len,i,j,sum = 0;
  54.    InitStack(&s1);

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

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

  68.        for(j =0;j<3;j++)
  69.        {
  70.            Pop(&s1,&c);
  71.            sum += (c-48) * pow(2,j);
  72.            if(s1.base == s1.top)
  73.            {
  74.                break;
  75.            }
  76.        }
  77.        Push(&s2,sum + 48);
  78.        sum = 0;
  79.    }

  80.    printf("转换的八进制数是");
  81.    while(s2.base != s2.top)
  82.    {
  83.        Pop(&s2,&c);
  84.        printf("%c",c);
  85.    }
  86.     printf("\n");
  87.     return 0;
  88. }
复制代码
在学习利用栈进行进制转换的时候,按照甲鱼各的方法写的二进制转换为十进制没问题,自己动手写的时候停止服务了,利用调试功能 报这个错误Program received signal SIGSEGV, Segmentation fault. 调试时到push函数,就是压栈的时候出问题,网上的答案说是对空指针进行了操作,可是我没改过压栈的代码啊,压栈代码和甲鱼哥的二进制转十进制是一样的,为什么报这个错误呢,弄了好久了,麻烦大家帮忙解决一下!!
最佳答案
2017-4-27 21:00:24
终于弄清楚了,是因为初始化栈的时候写的是底指针base等于头指针top,逻辑错误,罪过呀,正确的写法是 s->top = s->base;
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-27 21:00:24 | 显示全部楼层    本楼为最佳答案   
终于弄清楚了,是因为初始化栈的时候写的是底指针base等于头指针top,逻辑错误,罪过呀,正确的写法是 s->top = s->base;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 15:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表