5

在 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 block,在函数h中,
    变量x是最外层的块。(这意味着函数g'块嵌套在变量x的块中)下一个外部块是函数g,下一个函数f......那么,函数f的静态链接是否指向函数g的帧指针?还是函数h的帧指针?那么函数g的静态链接呢?

4

2 回答 2

2

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


g的激活记录:

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

f的激活记录:

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

h的激活记录:

  • x =1
  • 返回地址到main

main的激活记录:

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

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

于 2011-06-12T17:13:34.360 回答
0

我认为在P点,x只能参考x定义在h();如果它本身嵌套在里面,它只能引用xin 。g()g()

于 2011-06-12T03:03:37.923 回答