2015-04-06 37 views
1

我讀計算機系統:一個程序員的角度來看,我遇到下列C文件傳來:ÇLD鏈接時錯誤

foo.c的:

void f(void); 

int x = 15213; 
int y = 15212; 

int main() 
{ 
    f(); 
    printf("x = 0x%x y = 0x%x \n", x, y); 
    return 0; 
} 

Bar.c :

double x; 
void f() 
{ 
    x = -0.0; 
} 

被編譯用gcc -o foobar的foo.c的bar.c並給出以下輸出:

x = 0x0 y = 0x80000000 

哇。因此,由於int是4字節,double是8字節(無論如何,我的系統上),而x的強符號在Foo.c中,所以x被指定爲-0.0的十六進制表示,從而也會覆蓋y!

所以我想了解更多。標準C型保護措施如何在這裏不起作用? 0x0000000080000000被盲寫到EL存儲在哪裏,並且y恰好在它旁邊並被覆蓋?隨意儘可能詳細。

回答

1

你違反了「一個定義規則

外部定義是一個外部聲明,這也是一個函數(比內聯函數等)或 對象的 定義。如果在 表達式中使用外部鏈接聲明的標識符(除了作爲sizeof或_Alignof運算符的操作數的一部分,其結果是一個整數常量),則在整個 程序中的某處應該只有一個外部定義 標識符;否則,不得超過一個。

導致未定義behavior.Basically你有對象x和申報2個定義也varies.The標準說

是指同一對象或函數的所有聲明應有 兼容型;否則,行爲是不確定的。

注: %x用於打印出的無符號十六進制格式的無符號整數,並試圖打印使用%x負數導致不確定的行爲。

使用錯誤的格式說明符會導致未定義的行爲。

+0

%x用於顯示組成x和y的字節。重點是y被覆蓋。嘗試使用%d或其他。 – JamesLens 2015-04-06 12:56:21

+0

@JamesLens檢查編輯 – Gopi 2015-04-06 13:28:46

1

你有沒有注意到這個警告是在編譯時出現的。

的/ usr /斌/ LD:警告:符號'X」在/tmp/cciNZgVG.o對準4是/tmp/cc8pYw6O.o小於8

它是未定義的行爲。不要忽視警告。並根據您分配的值生成答案。