鱼C论坛

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

栈的长度更新时会出现乱码,为什么?求解答

[复制链接]
发表于 2013-3-16 12:37:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 世道变了 于 2013-3-16 19:30 编辑

先上代码 :
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define STACK_INIT_SPACE 10
  4. #define STACKINCREMENT 10

  5. typedef int ElemType;

  6. typedef struct stack
  7. {
  8.         ElemType* top;
  9.         ElemType* base;
  10.         int stackbace;
  11. }sqstack;

  12. void stackinit(sqstack* s)
  13. {
  14.         s->base=(ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SPACE );
  15.         if(!s->base)
  16.         {
  17.                 printf("Memory allocation failure !!!!");
  18.                 return;
  19.         }
  20.         s->top=s->base;
  21.         s->stackbace=STACK_INIT_SPACE;
  22. }

  23. void Push(sqstack *s,ElemType n)
  24. {
  25.         if(((s->top)-(s->base))>=(s->stackbace))
  26.         {
  27.                 s->base=(ElemType*)realloc(s->base,(s->stackbace+STACKINCREMENT)*sizeof(ElemType));
  28.                 if(!s->base)
  29.                 {
  30.                         printf("Memory increment allocation failure !!!!");
  31.                         return;
  32.                 }
  33.         }
  34.         *(s->top)=n;
  35.         s->top++;
  36. }

  37. void Pop(sqstack *s)
  38. {
  39.         if(s->top==s->base)
  40.         {
  41.                 printf("\nThe stack is empty!!!");
  42.         }
  43.         s->top--;
  44.         printf("\n%d 出栈\n",*(s->top));
  45. }

  46. void print(sqstack* s)
  47. {
  48.         ElemType *p;
  49.         p=s->top;
  50.         while(p!=s->base)
  51.         {
  52.                 p--;
  53.                 printf("%d   ",*p);
  54.         }
  55. }

  56. int main()
  57. {
  58.         sqstack s;
  59.         int n;
  60.         stackinit(&s);
  61.         n=20;
  62.         while(n)
  63.         {
  64.                 Push(&s,6);
  65.                 n--;
  66.         }
  67.         print(&s);
  68.         Pop(&s);
  69.         print(&s);
  70. }
复制代码
当main函数内的n>=21时堆栈内就会有乱码生成   小于时什么问题都没有,我个人觉得应该是push函数内的realloc导致的,该怎么解决呢????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-16 19:29:28 | 显示全部楼层
问题已经解决了,问题确实与realloc函数有关,因为增加堆栈大小时其第二个参数的大小没有变化,所指单元的内存单元长度并没有变,后面的值都是存放在该程序的管辖的内存范围之外的。 所以第二次输出的时候,就会出现一个不可预料的数据,后面的正确数据只是因为在第二次输出的时候没有别的程序访问或者利用这段内存空间,因此会有正确的输出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-19 15:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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