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爲什麼這個程序沒有運行時錯誤?
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爲什麼這個程序沒有運行時錯誤?
你的程序表現出不確定的行爲,你正在做的指針算術是無效的。
只能對實際指向數組的指針進行指針算術運算,並且加法或減法的結果仍然必須指向數組內部(或者如果您不打算對其進行解引用) 。
因此,任何事情都可能發生,編譯器可以生成任何代碼,感覺就像代碼。
指定後不允許指p-1
&k
這是一個無效的指針,並且使用它的行爲是未定義的。只有當你迷失指針碰到東西,引起了該錯誤,比如一些受保護的內存或在以後將成爲在某些計算(0)除數,例如位置發生
一個運行時錯誤。
首先,你爲什麼會給運行時錯誤? – 2012-04-29 08:01:12
內存訪問衝突可能。 – Ashok 2012-04-29 08:01:51
你爲什麼認爲它應該? p指向堆棧中的k,p-1指向堆棧中k之前的一個整數。這是沒有必要的訪問衝突。儘管這是一種危險而未定義的行爲。即使您替換了行*(p-1)= 0,也可以使用 – ssteinberg 2012-04-29 08:02:23