【问题标题】:Activation Record In GNU C (Nested Function)GNU C 中的激活记录(嵌套函数)
【发布时间】: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 的指针


  1. 对吗?
    但是,如果函数 g 返回,它是怎么回事?
    删除了 g 的激活和变量 z 的激活。
    然后在堆栈帧中,寻找孔。

  2. 这个洞真的出现了吗?

  3. 并根据 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


【解决方案1】:

在p点,栈上有4条激活记录:


g的激活记录:

  • 返回地址给f
  • 到 h 激活记录的静态链接
  • z = 12

f的激活记录:

  • x = 4
  • 返回地址给h
  • 到 h 激活记录的静态链接
  • y = 3

h的激活记录:

  • x = 1
  • 返回主地址

main的激活记录:

  • a = 未定义
  • 返回地址给操作系统

嵌套函数的每个激活记录都包含一个指向词法封闭的激活记录的链接(在这两种情况下都是 h),该链接是在调用函数并创建激活记录时设置的。在点 p,代码将取消引用该链接以查找 x 的值,并且通过这些链接查看是函数查看其他函数的激活记录的唯一时间。

【讨论】:

    【解决方案2】:

    我认为在P点,x只能引用h()中定义的x;如果它本身嵌套在g() 中,它只能引用g() 中的x

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 2011-06-17
      • 2012-01-17
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多