鱼C论坛

 找回密码
 立即注册
查看: 2820|回复: 7

[已解决]在重新分配空间后为什么top与base相差10

[复制链接]
发表于 2020-10-27 18:38:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图,在重新分配空间增加了10之后不应该是在top上增加了10空间吗?为什么top与base之差为10?

                               
登录/注册后可看大图

源代码如下
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>

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

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

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

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

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

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

最佳答案
2020-10-27 19:37:45
栈底不是重新分配空间了吗?
  1. if (s->top - s->base >= s->stacksize)        //先检测是否发生上溢
  2.         {
  3.                 s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));        //若发生,则增加10个内存空间(动态扩容)
  4.                 if (!s->base)        //检测内存是否分配成功
  5.                 {
  6.                         exit(0);
  7.                 }
  8.                 s->stacksize = s->stacksize + 10;
  9.                 s->top = s->base + 10; // 这里是因为栈发生上溢,栈底已经在上面重新分配了
  10.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-27 19:37:45 | 显示全部楼层    本楼为最佳答案   
栈底不是重新分配空间了吗?
  1. if (s->top - s->base >= s->stacksize)        //先检测是否发生上溢
  2.         {
  3.                 s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));        //若发生,则增加10个内存空间(动态扩容)
  4.                 if (!s->base)        //检测内存是否分配成功
  5.                 {
  6.                         exit(0);
  7.                 }
  8.                 s->stacksize = s->stacksize + 10;
  9.                 s->top = s->base + 10; // 这里是因为栈发生上溢,栈底已经在上面重新分配了
  10.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 19:38:43 | 显示全部楼层
重新初始化了一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 19:40:22 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 19:37
栈底不是重新分配空间了吗?

也就说这个增加的空间是直接加在了栈底?而不是直接加在栈顶?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 19:45:03 | 显示全部楼层
愷龍 发表于 2020-10-27 19:40
也就说这个增加的空间是直接加在了栈底?而不是直接加在栈顶?

对啊,这不是很明显嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 19:47:06 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 19:45
对啊,这不是很明显嘛

数据结构的初学者,现在才意识到,谢谢您的回答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 19:49:06 | 显示全部楼层
愷龍 发表于 2020-10-27 19:47
数据结构的初学者,现在才意识到,谢谢您的回答。

没事,我也是,共同进步
看看我发的这个帖子:https://fishc.com.cn/thread-183287-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 20:42:47 | 显示全部楼层
巴巴鲁 发表于 2020-10-27 19:49
没事,我也是,共同进步
看看我发的这个帖子:https://fishc.com.cn/thread-183287-1-1.html

ok
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 19:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表