1. 程式人生 > >深入理解計算機系統--第七章課後作業

深入理解計算機系統--第七章課後作業


對於問題一,輸出結果如下圖所示:

 

兩個都是弱定義值,所以連結器隨機選擇一個,而這時在c2.c中,g的值為37(強定義),故c1.c的g為37,呼叫函式f,g變為38

當執行第二條語句時,結果如圖:

 

多次定義變數g,程式在連結的時候報錯!!!

對於變數gC1定義一次為23,強定義,在C2也定義一次23,兩次強定義,報錯

 

 

我為了驗證這個結論,將global.h的語句寫入c2.c,然後編譯的時候不加-DINITIALIZE

並且C2.c也不加標頭檔案global.h

 

結果如下:

 

結果為24,因為在連結c1.cc2.c的時候,c1弱定義,c2強定義為23,所以呼叫函式f的結果為24,這證明了連結只進行一次,因為全域性變數在呼叫函式f之前修改了一次,

但是並沒有使f中的g發生改變,因該是c1.c中的g在與c2.c連結的時候被c2.c的強定義g

所賦值,這個比c2.c中的g的改變先發生,所以後面的值不影響前面的。


 

這個輸出的結果與未交換順序的一致,因為連結器只會將強定義覆蓋弱定義,c2.c中的

g=37為強定義,所以不管連結順序如何,結果只會與強定義有關。