首页 新闻 搜索 专区 学院

求大神指点!!包含realloc()函数的代码,在windows下运行总是出错,在linux下正常运行,这是为什么呢?

0
悬赏园豆:5 [已解决问题] 解决于 2013-09-03 11:30
#ifndef STACK_TO_QUEUE_H
#define STACK_TO_QUEUE_H

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

#define ALLOC_SIZE 1024
#define ElemType int

typedef struct sqstack
{
    ElemType *top;
    ElemType *base;
    ElemType stack_size;
}SqStack;                //顺序栈

typedef struct sqqueue
{
    SqStack front;
    SqStack rear;
}SqQueue;

void InitStack(SqStack *s)
{
    if((s->top=(ElemType*)malloc(ALLOC_SIZE*sizeof(ElemType)))==NULL)
    {
        printf("stack malloc error\n");
        exit(1);
    }
    s->base=s->top;
    s->stack_size=ALLOC_SIZE;
}

int pop_stack(SqStack *s,ElemType *data)
{
    if(s->top!=s->base)
    {
        s->top--;
        *data=*s->top;
        //s->stack_size--;
        return 1;
    }
    else                    //返回值为0,表示栈为空
    {
        return 0;
    }
}

void push_stack(SqStack *s,ElemType data)
{
    if((s->top-s->base)>=s->stack_size)
    {
        if((s->base=(ElemType *)realloc(s->base,(s->stack_size+ALLOC_SIZE)*sizeof(ElemType)))==NULL)
        {
            printf("stack realloc error\n");
            exit(1);
        }
        else
        {
            s->stack_size+=ALLOC_SIZE;
        }
    }
    *(s->top)=data;
    s->top++;
    //s->stack_size++;
}

}
#endif

上面这个是头文件:stack_to_queue.h

下面是主函数文件:

#include<stdio.h>
#include<stdlib.h>
#include"stack_to_queue.h"

int main()
{

    SqStack s;
    int i,status,data;

    InitStack(&s);
    for(i=0;i<2049;i++)
    {
        push_stack(&s,i);
    }
    printf("%d\n",s.top-s.base);
    while((status=pop_stack(&s,&data))!=0)
    {
        printf("%d  ",data);
    }
    printf("%d\n",s.top-s.base);

    return 0;
}

说明一下:代码实现的就是一个栈(因为我在做的是用两个栈实现一个队列,所以头文件的名字是stack_to_queue),栈的初始大小ALLOC_SIZE是1024,所以当压栈的数目(这里是2049)大于这个值时,需要重新分配空间,而出错就是在这里,要么分配失败,要么出现很奇怪的数字。求大神指点啊!!纠结好久了。

xmkk的主页 xmkk | 初学一级 | 园豆:116
提问于:2013-09-03 09:56
< >
分享
最佳答案
0

realloc 新分配一个块内存,然后把原来 s.base 指向的 stack_size 大小的内存拷贝到新分配的内存,所以 s.top 指向的地址也需要修改,让它指向在新分配的内存中的正确位置。

 

收获园豆:5
Launcher | 高人七级 |园豆:45045 | 2013-09-03 10:26

我以为就是在top指针之后增加内存呢?修改一下,试试看,多谢!

xmkk | 园豆:116 (初学一级) | 2013-09-03 11:26

改了之后,确实没有问题了,多谢!

xmkk | 园豆:116 (初学一级) | 2013-09-03 11:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册