c语言malloc之后再realloc的问题
不才学习严蔚敏的数据结构C语言版堆栈一课时,参考书上的内容自己编写的一个堆栈的程序,遇到了下面的怪问题.
程序如下(用vc++6.0环境)
stack.cpp:
#include <stdio.h>#include <stdlib.h>#include "../Status.h"#define STACK_INIT_SIZE 5 //堆栈初始大小#define STACKINCREMENT 5 //堆栈满之后再增加的大小typedef char *stackelem;typedef struct{ stackelem *base,*top; int stacksize;}sqstack;/*------堆栈基本操作-------*/Status initstack(sqstack *s){ s->base=(stackelem *)malloc(STACK_INIT_SIZE*sizeof(stackelem)); if(!s->base) exit(OVERFLOW); s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK;}Status stackempty(sqstack *s){ if(s->base==s->top) return TRUE; return FALSE;}Status gettop(sqstack *s,stackelem *e){ if(stackempty(s)) { e=NULL; printf("取栈顶失败:堆栈为空!\n"); return ERROR; } e=s->top-sizeof(stackelem); return OK;}int stacklength(sqstack *s){ if(stackempty(s)) return 0; else return (s->top-s->base)/sizeof(stackelem);}Status push(sqstack *s,stackelem e){ if(stacklength(s)>=s->stacksize) { printf("堆栈已满,增加空间\n"); s->base=(stackelem *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(stackelem)); if(!s->base) { printf("增加空间失败,压栈失败,程序退出!\n"); exit(OVERFLOW); } s->top=s->base+s->stacksize*sizeof(stackelem); s->stacksize+=STACKINCREMENT; } *(s->top)=e; s->top+=sizeof(stackelem); printf("元素 %s 压栈成功!\n",e); return OK;}Status pop(sqstack *s,stackelem e){ if(stackempty(s)) { printf("出栈失败:栈为空!\n"); return ERROR; } s->top-=sizeof(stackelem); e=*(s->top); /* *(s->top)=NULL ;*/ printf("元素 %s 出栈成功!\n",e); return OK;}Status clearstack(sqstack *s){ stackelem e; while(!stackempty(s)) pop(s,e); printf("堆栈已经清空\n"); return OK;}Status destroystack(sqstack *s){ clearstack(s); free(s->base); printf("堆栈已经销毁\n"); return OK;}Status printstack(sqstack *s){ printf("开始打印堆栈...\n\n"); if(stackempty(s)) { printf("打印错误:没有可以打印的内容!\n"); printf("\n打印堆栈结束.\n"); return ERROR; } stackelem *p=s->top; while((p>s->base)) { p-=sizeof(stackelem); //我认为malloc之后不管realloc多少次,如果没有失败,得到的空间应该是连续的,所以这样写 printf("\t%s\n",*p); } printf("\n打印堆栈结束.\n"); return OK;}void main(){ sqstack s; stackelem e; initstack(&s);/* push(&s,"2"); printstack(&s); clearstack(&s); printstack(&s);*/ push(&s,"1"); push(&s,"2"); push(&s,"3"); push(&s,"4"); push(&s,"5"); push(&s,"6"); push(&s,"7"); push(&s,"8"); push(&s,"9"); push(&s,"10"); push(&s,"11this is just for test"); push(&s,"12this is just for test"); push(&s,"13"); push(&s,"14 this for test"); push(&s,"15"); push(&s,"16"); push(&s,"17"); push(&s,"18"); printstack(&s); pop(&s,e); pop(&s,e); pop(&s,e); pop(&s,e); pop(&s,e); printstack(&s); destroystack(&s); }#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;