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

时间:2011-06-11 15:32:20

标签: c memory stack nested-function activation-codes

在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的指针


  1. 是吗? 但是,如果函数g返回,它是怎么回事? 删除g的激活和变量z的激活 然后在堆栈框架中,查看孔。

  2. 洞真的出现了吗?

  3. 根据在线块,在功能h,
    中 变量x是最外层的块。 (这意味着函数g'块嵌套在变量x的块中) 下一个外部块是函数g,下一个函数f ... 那么,函数f的静态链接指向函数g的帧指针吗? 还是函数h的帧指针? 功能g的静态链接怎么样?

2 个答案:

答案 0 :(得分:2)

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


g:

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

f:

的激活记录
  • x = 4
  • 将地址寄回h
  • h激活记录的静态链接
  • y = 3

h的激活记录:

  • x = 1
  • 将地址返回主

主要的激活记录:

  • a = undefined
  • 将地址返回给操作系统

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

答案 1 :(得分:0)

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