2013-06-04 191 views
-3

我無法理解以下問題的答案。 請幫我:)這段代碼的輸出是什麼

的輸出是什麼:從我的一個朋友

struct INT 
{ 
    int i; 
}; 

typedef struct INT INT; 

int Change(INT** INTptr) 
{ 
    (*INTptr) = (INT*)malloc(sizeof(INT)); 
    (*INTptr)->i = 1000; 
    return 500; 
} 

int main() 
{ 
    INT dummy = {750}; 

    INT* ptr = &dummy; 

    ptr->i = Change(&ptr); 

    printf("dummy.i = %d, ptr->i = %d\n", dummy.i, ptr->i); 

    return 0; 
} 

得到這個。

我想答案應該是:

dummy.i = 750,ptr-> I = 500

但是當我運行的代碼(GCC編譯器)我得到:

假人。 i = 500,ptr-> i = 1000

可以用不同的編譯器回答我的問題嗎?

而且,我還是不明白,爲什麼輸出爲500和1000 ...

在此先感謝!

+2

http://i.qkme.me/3ufkkc.jpg – 2013-06-04 12:23:49

+0

有人猜測,編譯器認爲'ptr =&dummy' ,生成代碼爲'dummy.i = ...' – Hasturkun

+2

爲什麼倒票? – barbur

回答

1

序列點是這裏的魔法字。和

ptr->i = Change(&ptr); 

是位置。 (由誰轉換?由作業或通過函數通過函數調用)

+0

謝謝!所以,這裏的答案實際上是未定義的行爲?我可以從不同的編譯器獲得不同的結果嗎? – barbur

+1

Visual Studio和GCC對此有不同的評估。很明顯,VS在調用Change()之前存儲'ptr-> i'的地方會改變ptr,而gcc會在這之後執行它。 – Bull