2015-12-11 34 views
-3

下面在C中做什麼(或嘗試做)到底是什麼?*(int *)0 ='X'產生什麼信號;

*(int *)0='X'; 

而且會產生什麼信號?它會是一個SIGSEGV嗎?

+5

是,在大多數POSIX系統,你會得到一個SIGSEGV。附: - 你無法編譯這個的任何特定原因,並自己測試它? –

+1

要生成信號,您必須明確生成它們。未定義的行爲對此不可靠。 –

+0

也許相關[什麼是「*((的char *) - 1)= 'X';」?代碼的意思(http://stackoverflow.com/q/20844863/1708801) –

回答

0

把這個變成一個完整的程序,segv.c:

int 
main(
    void) 
{ 
    *(int *) 0 = 'X'; 
    return 0; 
} 

和編譯:

clang -Oz -Wno-error -s -o segv segv.c 

現在,當我在我的64位GNU/Linux系統上運行它,我做實際上得到了一個段錯誤:

fish: "./segv" terminated by signal SIGSEGV (Address boundary error) 

但是,如果你正在尋求產生段錯誤,就像com中的一些人有些人指出,你應該使用raise(3)signal.h

3

*(int *)0='X';的行爲是undefined

編譯器可以自由地做任何事情,它爲所欲爲。 (i)提出一個SIGSEGV,(ii)根本不編譯該線有兩種可能性。

要明確地生成故障,使用raise酌情(在<signal.h>定義)。

+0

編譯器不會引發內存管理中斷。 –

+0

好吧,除了MSVC .. –

相關問題