2015-06-24 56 views
-3

我有以下代碼:爲什麼printf在*(int *)(0)= 0時不起作用;存在

main() 
{ 
    printf("Hello world !"); 
    *(int *)(0) = 0; 
} 

當我編譯該代碼並運行,它沒有打印字符串到控制檯。 在那之後,我修改了一點:

main() 
{ 
    printf("Hello world !\n"); 
    *(int *)(0) = 0; 
} 

而且,它的工作!

我覺得神祕的背後,是*(int *)(0) = 0;但不知道爲什麼!

Ps。我使用gcc 4.8.2來編譯。

+7

控制檯輸出被緩衝,如果您在打印緩衝區之前崩潰,則會丟失其內容。 –

+2

考慮到你改變的是被打印的字符串,而不是'*(int *)(0)= 0',你爲什麼認爲這行解釋了printf()的行爲改變? – Caleb

回答

6

直接原因是FILE *操作被緩衝,特別是stdout通常是行緩衝的(當它至少是交互式時)。如果沒有看到\n,並且在崩潰之前沒有明確調用fflush,則實際上沒有任何內容會寫入底層文件描述符。

更大的問題是取消引用NULL指針是未定義的行爲。對可能發生的事情絕對沒有限制。如果編譯器可以證明printf將始終返回,則允許UB在調用之前傳播,從而使得UB的整體性能。也就是說,編譯器很難證明這一點,特別是因爲FILE通常涉及一個虛擬表,所以它並不是真的。但重要的是,你甚至不能相信UB等到特定的時間。

0

fflush(stdout)在printf後面,你會在崩潰前看到字符串。

相關問題