在源程序上增加测试指针,可以看出,test的值的变化,这说明去掉对空间的判断,将引来严重后果。如果最大值是22,输入25个测试数据,看看test变化
#include
#include
#define STACK_INIT_SIZE 10 //
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct stack{
int *base;
int *top;
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
double *test;//测试指针
int InitStack(SqStack & S)
{//构造一个空栈
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
//增加test空间,并显示分配内存地址,记录最大个数
test=(double*)malloc(sizeof(double));
printf("S.base=%p,Smax=%p,test=%p\n",S.base,S.base+S.stacksize,test);
printf("最大个数为:%d\n",(int*)test-S.base);
return OK;
}
int GetStack(SqStack S,int &e)
{//弱栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR;
e=*(S.top-1);
// S.top++;
return OK;
}
int Push(SqStack &S,int e)
{//插入元素e为新的栈顶元素
//if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
//{
// S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
// if(!S.base) exit(OVERFLOW);//存储空间分配失败
// S.top=S.base+S.stacksize;
// S.stacksize+=STACKINCREMENT;
//}
*S.top++=e;
//S.top++;
return OK;
}
int Pop(SqStack &S,int &e)
{//弱栈不空,则删除栈S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
int main(void)
{
SqStack S;
int stat,i,e,n;
stat=InitStack(S);
printf("请输入你要进栈的元素个数n:");
scanf("%d",&n);
*test=3.14;
printf("test初值=%lf\n",*test);
for(i=0;i
printf("\n请输入你要进栈的元素e:");
scanf("%d",&e);
stat=Push(S,e);
}
printf("test现在值=%lf\n",*test);
stat=GetStack(S,e);
printf("\n输出出栈的元素:");
for(i=0;i
stat=Pop(S,e);
printf("%3d\n",e);
}
return 0;
}
这是应为你在分配了初始的十个空间后,从输入第十一个元素开始,覆盖了内存中的原来的数据,这是很危险的,所以为安全起见,当超过十个空间后,应另分配其他的空间来装载你的数据。