在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
一個
主要和指針的代碼主要
是嗎?
但是,如果函數g返回,它是怎麼回事?
刪除變量z的激活和激活。
然後在堆棧框架中,查看該孔。這個洞真的出現了嗎?
並根據嵌入塊,在函數h中,
變量x是最外層的塊。 (這意味着函數g'塊嵌套在變量x的塊中) 下一個外部塊是函數g,下一個函數f ... 然後,函數f的靜態鏈接點是否起作用g的幀指針? 還是函數h的幀指針? 函數g的靜態鏈接呢?
+1爲概念。哇!我現在一直在寫C代碼。從來不知道嵌套函數是可能的。我只認爲Pascal和Modula擁有它。無知的我 - 微笑... – itsols 2011-06-11 15:43:33
@itsols:嵌套函數不被C支持。它們是GCC的擴展,特別是在C代碼而不是C++中工作的擴展。有關他們是否是一個好主意的探索,請參閱:http://stackoverflow.com/questions/2929281/are-nested-functions-a-bad-thing-in-gcc – 2011-06-11 15:52:27
而且他們不是關閉。當定義嵌套函數的函數返回時,指向它定義的函數的指針將失效。這大大限制了它們的用處。而且,它們並未在所有架構上實現! – 2011-06-11 18:18:10