繁体   English   中英

GNU C 中的激活记录(嵌套函数)

[英]Activation Record In GNU C (Nested Function)

在 GNU C 中,结果是 13。因为使用了 static 链接。
否则,如果使用动态链接,结果将为 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. 那正确吗?
    但是,如果 function g 返回,情况如何?
    g 的激活和变量 z 的激活被删除。
    然后在堆栈帧中,查看孔。

  2. 洞真的出现了吗?

  3. 并且根据 In-line 块,在 function h 中,
    变量 x 是最外层的块。 (It means that function g' block is nested in variable x's block) next outer block is function g, next function f... Then, Do function f's Static link point to function g's frame pointer? 还是function h的帧指针? function g的Static链接呢?

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


g的激活记录:

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

f的激活记录:

  • x = 4
  • 返回地址到 h
  • static 链接到 h 激活记录
  • y = 3

h的激活记录:

  • x = 1
  • 返回地址到main

main的激活记录:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM