在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的指针
a
main和指向代码main的指针
是吗? 但是,如果函数g返回,它是怎么回事? 删除g的激活和变量z的激活 然后在堆栈框架中,查看孔。
洞真的出现了吗?
根据在线块,在功能h,
中
变量x是最外层的块。 (这意味着函数g'块嵌套在变量x的块中)
下一个外部块是函数g,下一个函数f ...
那么,函数f的静态链接指向函数g的帧指针吗?
还是函数h的帧指针?
功能g的静态链接怎么样?
答案 0 :(得分:2)
在p点,堆栈上有4条激活记录:
g:
的激活记录12
f:
的激活记录4
3
h的激活记录:
1
主要的激活记录:
嵌套函数的每个激活记录都包含一个指向词法封闭激活记录的链接(在这两种情况下都是h),这是在调用函数并创建激活记录时设置的。在p点,代码将取消引用该链接以查找x的值,并查看此类链接是函数查看其他函数的激活记录的唯一时间。
答案 1 :(得分:0)
我认为在P点,x
只能引用x
中定义的h()
;它只能引用x
中的g()
,如果它本身嵌套在g()
中。