5

GNU C では、The Result は 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 へのポインター


a


main およびコード main へのポインター


  1. そうですか?
    しかし、関数 g が返された場合、それはどうなっているでしょうか?
    g のアクティベーションと変数 z のアクティベーションが削除されます。
    次に、スタックフレームで、穴が見えます。

  2. 穴は本当に現れますか?

  3. In-line ブロックによると、関数 h では、
    変数 x が最も外側のブロックです。(関数 g' ブロックが変数 x のブロックにネストされていることを意味します) 次の外側のブロックは関数 g、次の関数 f ... では、関数 f の静的リンクは関数 g のフレーム ポインターを指していますか? または関数hのフレームポインタ?関数 g の静的リンクはどうですか?

4

2 に答える 2

2

ポイント p では、スタックに 4 つのアクティベーション レコードがあります。


g のアクティベーション レコード:

  • f への戻りアドレス
  • h アクティベーション レコードへの静的リンク
  • z =12

f のアクティベーション レコード:

  • ×=4
  • h への戻りアドレス
  • h アクティベーション レコードへの静的リンク
  • y =3

h のアクティベーション レコード:

  • ×=1
  • メインへの返信アドレス

メインのアクティベーション レコード:

  • a =未定義
  • OS への戻りアドレス

ネストされた関数の各アクティベーション レコードには、関数が呼び出されてアクティベーション レコードが作成されるときに設定される、字句的に囲んでいるアクティベーション レコード (ここではどちらの場合も h) へのリンクが含まれています。ポイント p で、コードはそのリンクを逆参照して x の値を見つけます。関数が他の関数のアクティベーション レコードを参照するのは、そのようなリンクを参照するときだけです。

于 2011-06-12T17:13:34.360 に答える
0

ポイント P では、で定義された;xのみを参照できると思います。それ自体が 内にネストされている場合にのみ、 inを参照できます。xh()xg()g()

于 2011-06-12T03:03:37.923 に答える