栈的压入,s->top=s->base+s->stackSize一句可否删除

clair 发布于 2016/05/07 11:16
阅读 487
收藏 0

本人小白,初学C语言,关于栈的问题有些不明白


int Push(sqStack *s,ElemType e)
{
    if(s->top-s->base>=s->stackSize)
    {
        s->base=(ElemType*)realloc(s->base,sizeof*(STACK_INIT_SIZE+addstackSize));
    
        if(!(s->base))
      {
           return ERROR;
      }
        s->top=s->base+s->stackSize;//这个很有必要吗?
        s->stackSize+=addstackSize;
    }
    *(s->top)=e;
    s->top++;
    return OK;
    

}

其中s->top=s->base+s->stackSize;一句可否删去,感觉s->top 还在此处,没必要调整

谢谢各位大神

加载中
0
Yetship
Yetship
这一个问题的关键在于 realloc 是怎么实现的,有两种情况:
  1. 如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。

  2. 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。

如果是第二种情况的话,s->top 就不是原来的 top 了。。

所以结论就是,很有必要。

0
c
clair

引用来自“yyLucifer”的评论

这一个问题的关键在于 realloc 是怎么实现的,有两种情况:
  1. 如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。

  2. 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。

如果是第二种情况的话,s->top 就不是原来的 top 了。。

所以结论就是,很有必要。

谢谢 ,清楚明白,现在懂了
返回顶部
顶部