sidfate 发表于 2014-3-7 13:19:38

堆栈初始化的问题

本帖最后由 sidfate 于 2014-3-7 17:02 编辑

代码如下:

#define STACK_INITSIZE 100
typedefintLX;
void initstack(stack *s)
{
s->bottom=(LX *)malloc(STACK_INITSIZE * sizeof(LX));   //调试到这里显示错误。错误如下图所示

if(!s->bottom)
exit(0);

s->top=s->bottom;
s->stack_size=STACK_INITSIZE;
}





求教是哪了错了。我照着小甲鱼给的写的=   =??

zheyitian 发表于 2014-3-7 19:04:39

能给全代码么?

oggplay 发表于 2014-3-7 19:58:23

估计你的要求的地址范围超过windows系统的允许界限了

sidfate 发表于 2014-3-8 14:04:11

zheyitian 发表于 2014-3-7 19:04 static/image/common/back.gif
能给全代码么?

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

#define STACK_INITSIZE 100
#define STACK_ADDSIZE10

typedef int LX;
typedef struct
{
        LX *bottom;
        LX *top;
        int stack_size;
}stack;

void initstack(stack *s)
{
        s->bottom=(LX *)malloc(STACK_INITSIZE * sizeof(LX));
       
        if(!s->bottom)
                exit(0);
       
        s->top=s->bottom;
        s->stack_size=STACK_INITSIZE;
}

void push(stack *s,LX *e)
{
        if((s->top-s->bottom)>=s->stack_size)
        {
                s->bottom=(LX *)realloc(s->bottom,(s->stack_size+STACK_ADDSIZE)*sizeof(LX));
                if(!s->bottom)
                        exit(0);
                s->top=s->bottom+s->stack_size;
                s->stack_size=s->stack_size+STACK_ADDSIZE;
        }
        (*s->top)=*e;
        s->top++;
}


void pop(stack *s,LX *e)
{
        if(s->top==s->top)
                return;
        *e=*--(s->top);
}


int main()
{
        stack *s;
        int i;
        int a={0},b={1,2,3,4,5,6,7,8,9,10};
        initstack(s);
        push(s,b);
        pop(s,a);
        for(i=0;i<5;i++)
        {
                printf("%d",a);
        }
        return 0;
}

sidfate 发表于 2014-3-8 14:04:54

oggplay 发表于 2014-3-7 19:58 static/image/common/back.gif
估计你的要求的地址范围超过windows系统的允许界限了

请看一下全代码:

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

#define STACK_INITSIZE 100
#define STACK_ADDSIZE10

typedef int LX;
typedef struct
{
        LX *bottom;
        LX *top;
        int stack_size;
}stack;

void initstack(stack *s)
{
        s->bottom=(LX *)malloc(STACK_INITSIZE * sizeof(LX));
       
        if(!s->bottom)
                exit(0);
       
        s->top=s->bottom;
        s->stack_size=STACK_INITSIZE;
}

void push(stack *s,LX *e)
{
        if((s->top-s->bottom)>=s->stack_size)
        {
                s->bottom=(LX *)realloc(s->bottom,(s->stack_size+STACK_ADDSIZE)*sizeof(LX));
                if(!s->bottom)
                        exit(0);
                s->top=s->bottom+s->stack_size;
                s->stack_size=s->stack_size+STACK_ADDSIZE;
        }
        (*s->top)=*e;
        s->top++;
}


void pop(stack *s,LX *e)
{
        if(s->top==s->top)
                return;
        *e=*--(s->top);
}


int main()
{
        stack *s;
        int i;
        int a={0},b={1,2,3,4,5,6,7,8,9,10};
        initstack(s);
        push(s,b);
        pop(s,a);
        for(i=0;i<5;i++)
        {
                printf("%d",a);
        }
        return 0;
}

zheyitian 发表于 2014-3-8 16:17:22

main()函数里改为:

int main()
{
        stack *s;
        s=(stack *)malloc(3 * 4);
        int i;
        int a={0},b={1,2,3,4,5,6,7,8,9,10};
        initstack(s);
        push(s,b);
        pop(s,a);
        for(i=0;i<5;i++)
        {
                printf("%d",a);
        }
      free(s->bottom);
        free(s);
        return 0;
}


优雅的独行者 发表于 2014-3-8 17:31:22

在main()函数中   stack *s; s在这里是一个函数栈内的数据,是不确定的,可能指向任何内存段
而在调用nitstack(s);中将s作为函数参数,进而对它指向的内存段进行修改,对于一些系统保护的内存则会发生错误。
建议
1.将stack *s 改为 stack s在函数调用中直接传递&s即可
2.或者stack *s后将s指向一段合法的内存段如堆内存或者栈内存。

在使用指针时一旦创建出来要么指向一段合法内存要么把它置为空指针NULL
希望对楼主有所帮助。

sidfate 发表于 2014-3-8 17:46:27

优雅的独行者 发表于 2014-3-8 17:31 static/image/common/back.gif
在main()函数中   stack *s; s在这里是一个函数栈内的数据,是不确定的,可能指向任何内存段
而在调用ni ...

谢谢很有帮助

sidfate 发表于 2014-3-8 17:46:59

zheyitian 发表于 2014-3-8 16:17 static/image/common/back.gif
main()函数里改为:

int main()


确实可以!!

yoyo89757 发表于 2014-3-8 18:10:16

太给力了,楼主我看好你哦

Simanzen 发表于 2014-3-9 11:41:50

哈哈,学习了

枫界易城 发表于 2014-3-9 12:48:23

恩恩,学习了,,,,,,,,

枫界易城 发表于 2014-3-9 12:49:15

额,以后再处理这方面的东西,看来我也要小心点!

phonezeng 发表于 2014-3-14 00:33:02

不错不错,学习了

qaed 发表于 2014-3-14 11:27:49

强大,学习了{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}

动感超人xx 发表于 2014-5-13 15:58:49

鱼币鱼币~~~~~~~~~~~~~

Kayllen 发表于 2014-5-14 17:42:45

hehe,学习了

Kayllen 发表于 2014-5-14 17:44:52

hehe,学习了
页: [1]
查看完整版本: 堆栈初始化的问题