如何解决GNU C嵌套函数中的激活记录
| 在GNU C中,结果为13。因为使用了静态链接。 否则,如果使用动态链接,则结果为16。#include <stdio.h>
int h(){
int x = 1;
int g(int z){
return z + x; <------------------ P
}
int f(int y){
int x = y + 1;
return g(x * y);
}
return f(3);
}
int main(){
int a = h();
printf(\"%d\\n\",a);
}
在P点,激活记录为
z = 12
x = 4
y = 3
f和指向代码f的指针
g和指向代码g的指针
x = 1
h和代码h的指针
一种
main和指向代码main的指针
那正确吗?
但是,如果函数g返回,它将如何进行?
g的激活和变量z的激活被删除。
然后在堆栈框架中,查看孔。
孔真的出现了吗?
并根据在线块,在函数h中,
变量x是最外面的块。 (这意味着函数g \'块嵌套在变量x \'的块中)
下一个外部块是函数g,下一个函数f ...
然后,函数f \的静态链接是否指向函数g \的帧指针?
还是函数h的帧指针?
函数g的静态链接呢?
解决方法
在点p,堆栈上有4条激活记录:
g的激活记录:
寄回地址至f
静态链接到h激活记录
z =
12
f的激活记录:
x =4
寄回地址到h
静态链接到h激活记录
y =3
h的激活记录:
x =1
返回主地址
主要的激活记录:
a =未定义
返回操作系统的地址
嵌套函数的每个激活记录都包含一个指向词汇的激活记录的链接(在此两种情况下均为h),该链接是在调用函数并创建激活记录时设置的。在点p,代码将取消对该链接的引用,以找到x的值,并且只有通过此类链接才能查看一个函数将查看其他某个函数的激活记录的时间。
, 我认为在P点,“ 5”只能指“ 7”中定义的“ 5”。如果它本身嵌套在g()
中,则只能引用g()
中的x
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。