2011-11-08 75 views

回答

5

這是未定義的行爲。你很不幸,什麼都沒有發生。

4

你只是在超出界限的內存位置上寫。 C不在乎,但你應該。另外,C沒有例外(至少在你的問題中不是那種例外)。

+0

對不起,我正在談論一場崩潰。有 –

0

C中沒有例外。

+0

有。看看'C99§7.6.2浮點異常'。 – Mankarse

+0

我的意思是崩潰。 –

2

是的,你是覆蓋另一個內存位置。沒有什麼可能會立即發生,但如果在真正的程序中完成,您可能會覆蓋重要數據,並且程序可能因此而隨時崩潰。不可能說出崩潰將會發生什麼,或者它會在何時何地發生。

1

當你聲明一個聯合時,你只是說可以用不同的方式讀取x個字節。

union u{ 
     char a[95]; 
     int b; 
     char *c; 
    }; 

這告訴x字節的數目可以被理解爲一個字符數組,整數和字符指針的編譯器。 (還要注意,根據編譯器開關,聯合可能會被填充字節到偶數字節)。

union u u1; 
當您聲明型工會ü您聲明它作爲全球。數據段的成員變量U1

(承擔與我在這裏)。

現在如果你會宣佈合併之後的東西說的數組:

char s1[100]; 

它通常會被放置在.data段U1之後。

因爲當你試圖在聯合實例(95字節)之外寫入時,你的u1的大小是95,所以你很可能正在寫入s1數組。

+----+ <- 0 
| u1 | 
+----+ <- 94 
| s1 | <- u1.a[102]; 
+----+ 

C允許你爲效率芻議做這樣的事情,它不會做範圍檢查陣列上,在某些情況下,這是一件幸事 - 它允許大量的自由 - 但更多的時候它會造成麻煩。在你的情況下,你正在訪問內存中的某個地方,這可能會或可能不會被寫保護。

+0

非常感謝Anders –

相關問題