鱼C论坛

 找回密码
 立即注册
查看: 3889|回复: 13

[技术交流] 小甲鱼在栈这一讲解中的一个漏洞

[复制链接]
发表于 2013-10-21 19:07:23 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 my_angel 于 2013-10-23 15:42 编辑

大家好,我想在这一板块的鱼友们应该都看过小甲鱼出品的《数据结构与算法》这一视屏讲解。
甲鱼哥的视频非常不错,这一点是毋容置疑的,甚至比某些大学高校的讲师还要尽善尽美(比如我的学校)。

但是,在视频的过程中还是有一些小问题(这个我想比较细心的朋友们还是能够发现的,不过问题不大)。

不过今天我在栈这一讲解中(具体是25-进制转化),发现了一个逻辑上的问题。
具体问题的代码如下:
  1. void Push(SqStack *s,ElemType e)        //入栈
  2. {
  3.         if(StackLength(*s) >= s->StackSize )
  4.         {
  5.                 s->base = (ElemType *)realloc(s->base , (s->StackSize + STACK_INCREMENT)*sizeof(ElemType) );
  6.                 if(!s->base){
  7.                         exit(ERROR);
  8.                 }
  9.         }
  10.         *(s->top) = e;
  11.         s->top++;
  12. }
复制代码

继续学下去发现“甲鱼胸”在后面课程给出的代码中已经是解决了这个问题,所以就不再隐藏了。。。

这段代码其实在一般情况下是没有问题的,但是如果STACK_INIT_SIZE容量不足时进行realloc时就很有可能发生问题了。
这里我的测试如下:
#define STACK_INIT_SIZE 2        //初始化容量
#define STACK_INCREMENT 1        //后续增量

这样比较快进行扩容。。。。

这里其实产生问题的是realloc这个函数。。。

realloc语法:
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
//新的大小一定要大于原来的大小,不然的话会导致数据丢失!

注意:假如原来的内存后面还有足够多剩余内存的话,realloc的内存<原来的内存+剩余内存,realloc还是返回原来内存的地址;
但是,假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址。

因此,也就是说上述代码s->base的指向很可能已经变了,而s->top没有做出相应的改变。所以继续执行同样的代码就会发生错误了。

因此,我们要对相应的s->top进行修改。同样的,不要忘记对s->StackSize进行修改哦。。。

代码如下:
  1. Status Push(SqStack *s,ElemType e)        //入栈
  2. {
  3.         if(StackLength(*s) >= s->StackSize )
  4.         {
  5.                 s->base = (ElemType *)realloc(s->base , (s->StackSize + STACK_INCREMENT)*sizeof(ElemType) );
  6.                 if(!s->base){
  7.                         printf("Push Failed:cannot realloc space.\n");
  8.                         exit(ERROR);
  9.                 }
  10.                 s->top = s->base + s->StackSize;        //realloc后,s->base地址变了,因此s->top的地址也要对应的进行修改
  11.                 s->StackSize += STACK_INCREMENT;        //当前栈最大容量改变
  12.         }
  13.         *(s->top) = e;
  14.         s->top++;
  15.         return TRUE;
  16. }
复制代码


评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +10 收起 理由
小甲鱼 + 10 + 10 + 10 探索精神值得发扬!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2013-10-21 19:58:49 | 显示全部楼层
好久没发贴了,自己给自己顶一个。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-21 20:33:02 | 显示全部楼层
有点好奇喔
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-21 21:33:29 | 显示全部楼层
很用心,向你学习,抓紧学习去咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-1 20:31:09 | 显示全部楼层
支持一下不错的,好好学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-9 20:18:27 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-13 00:43:53 | 显示全部楼层
楼主 钻研精神哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-16 09:23:05 | 显示全部楼层
表示完全看不懂,看到栈我以为是汇编代码了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-16 09:23:47 | 显示全部楼层
这个是C语言的代码还是?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-16 21:06:28 | 显示全部楼层
这是哪里的内容啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-26 15:39:12 | 显示全部楼层
较真,精神加分。:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-27 18:23:18 From FishC Mobile | 显示全部楼层
是不是啊,这么吊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-12 07:01:59 | 显示全部楼层
什么漏洞?  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-22 12:34:53 | 显示全部楼层
之前总看到这个函数,也知道它的作用。
但是在实际应用中就忘掉了...
感谢这位同学的帖子,向你学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 15:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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