2011-06-11 50 views
5

在GNU C中,結果是13.因爲使用了靜態鏈接。
否則,如果使用動態鏈接,其結果將是16GNU C中的激活記錄C(嵌套函數)

#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


克和指針代碼克


X = 1


小時並指向代碼h的指針3210


一個


主要和指針的代碼主要


  1. 是嗎?
    但是,如果函數g返回,它是怎麼回事?
    刪除變量z的激活和激活。
    然後在堆棧框架中,查看該孔。

  2. 這個洞真的出現了嗎?

  3. 並根據嵌入塊,在函數h中,
    變量x是最外層的塊。 (這意味着函數g'塊嵌套在變量x的塊中) 下一個外部塊是函數g,下一個函數f ... 然後,函數f的靜態鏈接點是否起作用g的幀指針? 還是函數h的幀指針? 函數g的靜態鏈接呢?

+0

+1爲概念。哇!我現在一直在寫C代碼。從來不知道嵌套函數是可能的。我只認爲Pascal和Modula擁有它。無知的我 - 微笑... – itsols 2011-06-11 15:43:33

+5

@itsols:嵌套函數不被C支持。它們是GCC的擴展,特別是在C代碼而不是C++中工作的擴展。有關他們是否是一個好主意的探索,請參閱:http://stackoverflow.com/questions/2929281/are-nested-functions-a-bad-thing-in-gcc – 2011-06-11 15:52:27

+0

而且他們不是關閉。當定義嵌套函數的函數返回時,指向它定義的函數的指針將失效。這大大限制了它們的用處。而且,它們並未在所有架構上實現! – 2011-06-11 18:18:10

回答

2

在點P處,有在堆棧上4個激活記錄:爲克


激活記錄:

  • 返回地址到f
  • 靜態鏈接到h激活記錄
  • z = 12
對於f

激活記錄:

  • X = 4
  • 返回地址到h
  • 靜態鏈接到h激活記錄
  • Y = 3

激活記錄h:

  • X = 1
  • 返回地址到主

激活記錄爲主要:

  • 一個= 未定義
  • 返回地址到OS

用於嵌套函數每個激活記錄包含一個鏈接到詞彙包圍激活記錄(H在這裏這兩種情況下),其被設置時調用該函數時和激活記錄被創建。在p點,代碼將取消引用該鏈接以查找x的值,並且查看這些鏈接是函數將查看某個其他函數的激活記錄的唯一時間。

0

我認爲,在點P,x只能引用在h()定義的x;如果它本身嵌套在g()內,它只能參考g()中的x