免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2759 | 回复: 9
打印 上一主题 下一主题

关于子函数的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-30 11:11 |只看该作者 |倒序浏览
1,父函数中的自动变量是存储在堆栈中的,从汇编的角度看,子函数可以通过ebp访问堆栈中的内容,比如8(%ebp),那么,在子函数中应该能访问父函数中的自动变量阿?

论坛徽章:
0
2 [报告]
发表于 2008-10-30 11:25 |只看该作者

回复 #1 xdshting 的帖子

原则上都可以访问.

论坛徽章:
0
3 [报告]
发表于 2008-10-30 12:03 |只看该作者
x86实模式汇编可以,保护就不知道了。
编译角度来看,符号表有作用域的,不是一个作用域的是不可见的。如果一个编译器实现的符号表那么糟糕的话,还是算了吧。

论坛徽章:
0
4 [报告]
发表于 2008-10-31 12:22 |只看该作者
这么做有意义吗?想改变,可以传地址啊

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2008-10-31 14:05 |只看该作者
当然可以,可是你觉得有意义吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2008-10-31 14:06 |只看该作者
访问父函数的栈内存也是通过栈指针。
那么你想没想过如果是不同的函数都调用了这个函数又怎么办呢?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2008-11-01 00:09 |只看该作者
因为这些都是典型的不走大门而偏要翻窗户的行为,非奸即盗

论坛徽章:
0
8 [报告]
发表于 2008-11-01 16:05 |只看该作者
谢谢各位,不是为了应用,所以没想过有什么意义,只是想知道自己的想法对不对

论坛徽章:
0
9 [报告]
发表于 2008-11-02 13:52 |只看该作者
原帖由 xdshting 于 2008-10-30 11:11 发表
1,父函数中的自动变量是存储在堆栈中的,从汇编的角度看,子函数可以通过ebp访问堆栈中的内容,比如8(%ebp),那么,在子函数中应该能访问父函数中的自动变量阿?

自然可以,有些语言(比如PASCAL)支持嵌套的函数定义:
用类C语言写:
  int father() {
      int auto1, auto2;
   
     ...
      int child() {
          int j;

          j=auto1;
       ....
      }
      ....
      auto2 = child();
      ...
}

在某个函数内部定义的函数可以访问父函数的局部变量,甚至父函数的父函数的局部变量。
这些语言的编译器在具体实现时就是通过传递ebp来实现子函数访问父函数局部变量的,一般叫做(static link)。在父函数调用子函数时,父函数将自己的栈帧指针(ebp)作为附加参数push到堆栈中,当子函数希望访问父函数的局部变量时,通过刚才的参数(它一般都在子函数栈帧ebp的固定偏移处)可以得到父函数的栈帧,接着就像访问自己的局部变量一样访问父函数的局部变量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP