堆栈初始化的问题
本帖最后由 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;
}
求教是哪了错了。我照着小甲鱼给的写的= =??
能给全代码么? 估计你的要求的地址范围超过windows系统的允许界限了 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;
}
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;
}
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;
}
在main()函数中 stack *s; s在这里是一个函数栈内的数据,是不确定的,可能指向任何内存段
而在调用nitstack(s);中将s作为函数参数,进而对它指向的内存段进行修改,对于一些系统保护的内存则会发生错误。
建议
1.将stack *s 改为 stack s在函数调用中直接传递&s即可
2.或者stack *s后将s指向一段合法的内存段如堆内存或者栈内存。
在使用指针时一旦创建出来要么指向一段合法内存要么把它置为空指针NULL
希望对楼主有所帮助。
优雅的独行者 发表于 2014-3-8 17:31 static/image/common/back.gif
在main()函数中 stack *s; s在这里是一个函数栈内的数据,是不确定的,可能指向任何内存段
而在调用ni ...
谢谢很有帮助 zheyitian 发表于 2014-3-8 16:17 static/image/common/back.gif
main()函数里改为:
int main()
确实可以!! 太给力了,楼主我看好你哦 哈哈,学习了 恩恩,学习了,,,,,,,, 额,以后再处理这方面的东西,看来我也要小心点! 不错不错,学习了 强大,学习了{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:} 鱼币鱼币~~~~~~~~~~~~~ hehe,学习了 hehe,学习了
页:
[1]