GNU C中的激活记录(嵌套函数)
在GNUC中,结果是13。因为使用了静态链接。GNU C中的激活记录(嵌套函数),c,memory,stack,nested-function,activation-codes,C,Memory,Stack,Nested Function,Activation Codes,在GNUC中,结果是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); } ret
否则,如果使用动态链接,结果将为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);
}
#包括
int h(){
int x=1;
整数g(整数z){
返回z+x;我认为在p点,x
只能引用在h()
中定义的x
;它只能引用g()
中的x
,如果它本身嵌套在g()
中,则在p点,堆栈上有4条激活记录:
g的激活记录:
- 寄回地址f
- h激活记录的静态链接
- z=
12
f的激活记录:
- x=
4
- 寄回地址
- h激活记录的静态链接
- y=
3
h的激活记录:
- x=
1
- 寄回主地址
主设备的激活记录:
- a=未定义
- 返回操作系统地址
嵌套函数的每个激活记录都包含一个指向词汇性封闭激活记录的链接(这里两种情况下都是h)这是在调用函数并创建激活记录时设置的。在p点,代码将取消引用该链接以查找x的值,并且通过这些链接查看是函数唯一一次查看其他函数的激活记录。+1了解这个概念。哇!我已经编写C代码很多年了。从未见过EW嵌套函数是可能的。我只想到Pascal和Modula有它。无知我-微笑……ITSOL:嵌套的函数不被C支持。它们是GCC的扩展,特别是在C代码中而不是C++中的一个。为了探索它们是否是个好主意,请参阅:它们不是闭包。当定义嵌套的函数时ed函数返回,任何指向它定义的函数的指针都会失效。这极大地限制了它们的实用性。而且,它们并不是在所有体系结构上都实现的!