愷龍 发表于 2020-10-27 18:38:07

在重新分配空间后为什么top与base相差10

如图,在重新分配空间增加了10之后不应该是在top上增加了10空间吗?为什么top与base之差为10?
https://pic.downk.cc/item/5f97f8631cd1bbb86b278a8d.jpg
源代码如下
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct        //创建一个栈
{
        char * base;        //栈底        由于栈存放的是char型数据,指针类型也应为char*型
        char * top;                //栈顶
        int stacksize;//栈的容量
}Sqstack2;

void initstack(Sqstack2*s)        //栈的初始化函数
{
        s->base = (char*)malloc(20 * sizeof(char));        //开始时申请20块连续的内存单元
        if (!s->base)        //检测内存是否分配成功
        {
                exit(0);
        }
        s->top = s->base;        //开始是为空栈,栈顶和栈底的地址相同
        s->stacksize = 20;        //分配内存成功后更新栈的容量
}

void push(Sqstack2*s,char x)        //入栈函数
{
        if (s->top - s->base >= s->stacksize)        //先检测是否发生上溢
        {
                s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));        //若发生,则增加10个内存空间(动态扩容)
                if (!s->base)        //检测内存是否分配成功
                {
                        exit(0);
                }
                s->stacksize = s->stacksize + 10;
                s->top = s->base + 10;
        }
        *(s->top) = x;        //开始将数据存入栈中
        s->top++;        //存入一个数据,栈顶的地址相应增加(top位于最外侧数据的上一个单元)
}

void pop(Sqstack2*s, char * x)        //出栈函数
{
        if (s->top == s->base)        //检测是否发生下溢
        {
                return;
        }
        s->top--;
        * x = *(s->top);        //利用指针将数据传出
}

int stacklen(Sqstack2*s)        //计算栈中元素个数函数
{
        return (s->top - s->base);        //这里并不是将地址相减,而是以char位单位计算元素个数
}

int main()
{
        char c;       
        Sqstack2 * s = (Sqstack2*)malloc(sizeof(Sqstack2));        //申请一块Sqstack类型的内存的单元并用指针s存放此单元的地址
        int len, i, sum = 0;
        initstack(s);        //先将栈初始化
        printf("请输入二进制数:");
        c=getchar();        //输入数字
        while (c != '#')        //当输入#时表示输入完毕
        {
                push(s, c);        //将输入的数字入栈
                c=getchar();        //继续输入下一个数字
        }
        len = stacklen(s);        //len表述栈中元素个数
        for (i = 0; i < len; i++)
        {
                pop(s, &c);        //将元素出栈,函数用指针将数值赋值到c上
                sum = sum + (c - 48)*pow(2, i);        //查看ASCII码,用c-48将数字由char型转换为int型,并进行数学运算
        }
        printf("您所要的结果是:%d", sum);
        return 0;
}

巴巴鲁 发表于 2020-10-27 19:37:45

栈底不是重新分配空间了吗?
if (s->top - s->base >= s->stacksize)      //先检测是否发生上溢
      {
                s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));      //若发生,则增加10个内存空间(动态扩容)
                if (!s->base)      //检测内存是否分配成功
                {
                        exit(0);
                }
                s->stacksize = s->stacksize + 10;
                s->top = s->base + 10; // 这里是因为栈发生上溢,栈底已经在上面重新分配了
      }

巴巴鲁 发表于 2020-10-27 19:38:43

重新初始化了一下

愷龍 发表于 2020-10-27 19:40:22

巴巴鲁 发表于 2020-10-27 19:37
栈底不是重新分配空间了吗?

也就说这个增加的空间是直接加在了栈底?而不是直接加在栈顶?

巴巴鲁 发表于 2020-10-27 19:45:03

愷龍 发表于 2020-10-27 19:40
也就说这个增加的空间是直接加在了栈底?而不是直接加在栈顶?

对啊,这不是很明显嘛{:10_256:}

愷龍 发表于 2020-10-27 19:47:06

巴巴鲁 发表于 2020-10-27 19:45
对啊,这不是很明显嘛

数据结构的初学者,现在才意识到,谢谢您的回答。

巴巴鲁 发表于 2020-10-27 19:49:06

愷龍 发表于 2020-10-27 19:47
数据结构的初学者,现在才意识到,谢谢您的回答。

没事,我也是,共同进步
看看我发的这个帖子:https://fishc.com.cn/thread-183287-1-1.html

愷龍 发表于 2020-10-27 20:42:47

巴巴鲁 发表于 2020-10-27 19:49
没事,我也是,共同进步
看看我发的这个帖子:https://fishc.com.cn/thread-183287-1-1.html

ok
页: [1]
查看完整版本: 在重新分配空间后为什么top与base相差10