世道变了 发表于 2013-3-16 12:37:13

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

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

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

#define STACK_INIT_SPACE 10
#define STACKINCREMENT 10

typedef int ElemType;

typedef struct stack
{
      ElemType* top;
      ElemType* base;
      int stackbace;
}sqstack;

void stackinit(sqstack* s)
{
      s->base=(ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SPACE );
      if(!s->base)
      {
                printf("Memory allocation failure !!!!");
                return;
      }
      s->top=s->base;
      s->stackbace=STACK_INIT_SPACE;
}

void Push(sqstack *s,ElemType n)
{
      if(((s->top)-(s->base))>=(s->stackbace))
      {
                s->base=(ElemType*)realloc(s->base,(s->stackbace+STACKINCREMENT)*sizeof(ElemType));
                if(!s->base)
                {
                        printf("Memory increment allocation failure !!!!");
                        return;
                }
      }
      *(s->top)=n;
      s->top++;
}

void Pop(sqstack *s)
{
      if(s->top==s->base)
      {
                printf("\nThe stack is empty!!!");
      }
      s->top--;
      printf("\n%d 出栈\n",*(s->top));
}

void print(sqstack* s)
{
      ElemType *p;
      p=s->top;
      while(p!=s->base)
      {
                p--;
                printf("%d   ",*p);
      }
}

int main()
{
      sqstack s;
      int n;
      stackinit(&s);
      n=20;
      while(n)
      {
                Push(&s,6);
                n--;
      }
      print(&s);
      Pop(&s);
      print(&s);
}
当main函数内的n>=21时堆栈内就会有乱码生成   小于时什么问题都没有,我个人觉得应该是push函数内的realloc导致的,该怎么解决呢????

世道变了 发表于 2013-3-16 19:29:28

问题已经解决了,问题确实与realloc函数有关,因为增加堆栈大小时其第二个参数的大小没有变化,所指单元的内存单元长度并没有变,后面的值都是存放在该程序的管辖的内存范围之外的。 所以第二次输出的时候,就会出现一个不可预料的数据,后面的正确数据只是因为在第二次输出的时候没有别的程序访问或者利用这段内存空间,因此会有正确的输出。
页: [1]
查看完整版本: 栈的长度更新时会出现乱码,为什么?求解答