c语言malloc之后再realloc的有关问题
c语言malloc之后再realloc的问题
不才学习严蔚敏的数据结构C语言版堆栈一课时,参考书上的内容自己编写的一个堆栈的程序,遇到了下面的怪问题.
程序如下(用vc++6.0环境)
stack.cpp:
Status.h的内容如下:
不才学习严蔚敏的数据结构C语言版堆栈一课时,参考书上的内容自己编写的一个堆栈的程序,遇到了下面的怪问题.
程序如下(用vc++6.0环境)
stack.cpp:
- C/C++ code
#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); }
Status.h的内容如下:
- C/C++ code
#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status;