【发布时间】:2011-09-13 02:13:06
【问题描述】:
在 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点,Activation Record为
z = 12
x = 4
y = 3
f 和指向代码 f 的指针
g 和指向代码 g 的指针
x = 1
h 和指向代码 h 的指针
一个
main 和指向代码 main 的指针
对吗?
但是,如果函数 g 返回,它是怎么回事?
删除了 g 的激活和变量 z 的激活。
然后在堆栈帧中,寻找孔。这个洞真的出现了吗?
并根据 in-line 块,在函数 h,
变量 x 是最外层的块。 (这意味着函数 g' 块嵌套在变量 x 块中) 下一个外部块是函数 g,下一个函数 f... 那么,函数 f 的静态链接是否指向函数 g 的帧指针? 还是函数h的帧指针? 函数g的静态链接呢?
【问题讨论】:
-
+1 表示概念。哇!我已经编写 C 代码很长时间了。从来不知道嵌套函数是可能的。我只认为 Pascal 和 Modula 有它。不知道我 - 微笑......
-
@itsols:C 不支持嵌套函数。它们是 GCC 的扩展,尤其适用于 C 代码但不适用于 C++。有关它们是否是一个好主意的探索,请参阅:stackoverflow.com/questions/2929281/…
-
而且它们不是闭包。当定义嵌套函数的函数返回时,任何指向它定义的函数的指针都会失效。这极大地限制了它们的用途。此外,它们并没有在所有架构上实现!
标签: c memory stack nested-function activation-codes