LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: freegnu

缓冲区的大小?

[复制链接]
发表于 2005-5-3 19:05:29 | 显示全部楼层
栈的结构:



  1. (low address)
  2. --->   ...
  3. --->  16 bytes
  4. --->  for others
  5. --->    ...
  6. --->  40 bytes
  7. --->  of small
  8. --->  array
  9. --->   ...
  10. --->  return address
  11. --->   ...
  12. (high address)

复制代码


当你使用small数组溢出的时候, 返回地址被破坏, 当执行ret指令的时候EIP装入了一个错误的地址, 因此取下一条指令时Segment faulty. 明白了么?
回复 支持 反对

使用道具 举报

发表于 2005-5-3 19:21:10 | 显示全部楼层
Post by freegnu
是我搞错了

我想应该是这样的
small[]/*40byt*/
。。。/*不知道这12byte是干什么用的?*/
small address/*4byte*/


数组没有必要用四个字节保存address, 对数组名的引用直接得到它在栈中的地址, 对数组名取地址如&small没有意义. 这是和指针的区别.
small数组之外的16个字节是因为编译优化的原因, 注意在调用函数gets和printf时用的是lea和mov而不是push.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 19:49:49 | 显示全部楼层
>>Tetris
small数组之外的16个字节是因为编译优化的原因, 注意在调用函数gets和printf时用的是

我要的是就是这句。
我想之所以多分配一些空间,可能是为了对齐,保护等作用吧
回复 支持 反对

使用道具 举报

发表于 2005-5-3 20:14:26 | 显示全部楼层
Post by freegnu
>>Tetris
small数组之外的16个字节是因为编译优化的原因, 注意在调用函数gets和printf时用的是

我要的是就是这句。
我想之所以多分配一些空间,可能是为了对齐,保护等作用吧


主要是使得函数调用加快. 你用O0编译一下看看.
回复 支持 反对

使用道具 举报

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

本版积分规则

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