数据结构栈满追加存储空间问题

Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize){
S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKCRMENT;
}
*S.top++;=e;
return OK;
}
这是个插入新元素的函数,若栈已满,S.top此时指着最后一个进栈的元素的后一个地址,S.base指着第一个进栈元素,执行完S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType))这句语句后,是从S.base开始申请STACK_INIT_SIZE 个空间,还是从S.top开始申请STACK_INIT_SIZE 个空间,不可能是前者啊,因为那些空间都被用来放进栈元素了,那如果是后者,不是应该这个写吗:S.top=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType))?求解!

第1个回答  2011-09-29
这里不能用malloc函数追加数组空间。因为malloc函数是这样的:
malloc操作系统申请空余内存的“堆”存储空间,然后把申请到的首地址返回。
若栈已满,执行到这条语句
S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
则S.base指向新申请到的内存地址,原base地址丢失。
也就是说,你通过malloc函数申请的空间是操作系统分配的,不能通过指定起始地址来分配。
应该用realloc函数,此函数原型:
void *realloc(void *mem_address, unsigned int newsize);
语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
注意:新的大小一定要大于原来的大小不然的话会导致数据丢失!
此函数功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。本回答被提问者采纳
相似回答