2012-04-29 119 views
-1
int main() 
{ 
    int i,j,k; 
    i=1;j=2;k=3; 
    int *p =&k; 
    *(p-1)=0; 
    printf("%d%d%d",i,j,k); 
    getch(); 
} 

輸出爲1 2 3爲什麼這個程序沒有運行時錯誤?

+1

首先,你爲什麼會給運行時錯誤? – 2012-04-29 08:01:12

+0

內存訪問衝突可能。 – Ashok 2012-04-29 08:01:51

+0

你爲什麼認爲它應該? p指向堆棧中的k,p-1指向堆棧中k之前的一個整數。這是沒有必要的訪問衝突。儘管這是一種危險而未定義的行爲。即使您替換了行*(p-1)= 0,也可以使用 – ssteinberg 2012-04-29 08:02:23

回答

3

你的程序表現出不確定的行爲,你正在做的指針算術是無效的。

只能對實際指向數組的指針進行指針算術運算,並且加法或減法的結果仍然必須指向數組內部(或者如果您不打算對其進行解引用) 。

因此,任何事情都可能發生,編譯器可以生成任何代碼,感覺就像代碼。

+0

我試過這段代碼,因爲int i; float * p =(float *)&i; * p = 100.00; 012fprintf(「%d」,i);沒有運行時間錯誤。那麼我是否應該期待上述代碼的意外行爲? – Ashok 2012-04-29 08:06:31

+0

這也是無效的代碼,你違反了別名規則。請參閱http://stackoverflow.com/questions/98340/what-are-the-common-undefined-unspecified-behavior-for-c-that-you-run-into – Mat 2012-04-29 08:09:59

2

指定後不允許指p-1&k這是一個無效的指針,並且使用它的行爲是未定義的。只有當你迷失指針碰到東西,引起了該錯誤,比如一些受保護的內存或在以後將成爲在某些計算(0)除數,例如位置發生

+0

嗯,你真的可以參考任何地址。未知的是當你做什麼時會發生什麼。所以你不應該。這是一個很好的觀點,但也許是OP所問的問題。這不是Java。 – joshp 2012-04-29 08:11:40

+0

其實,根據標準,你根本不允許使用它。甚至不會將其分配給其他變量,並且此類操作會導致未定義的行爲。 – MByD 2012-04-29 08:25:49

+0

我相信你的知識。當我做了最C的時候,沒有標準。我認爲他的編譯器正在讓他這樣做。這就是我所允許的意思。做任何你稱之爲的事情都是件壞事。 – joshp 2012-04-29 08:33:13

0

一個運行時錯誤。

相關問題