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();
}
出力は123です。
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();
}
出力は123です。
あなたのプログラムは未定義の動作を示します。あなたが行っているポインター演算は無効です。
実際に配列を指しているポインターに対してのみポインター演算を行うことができ、加算または減算の結果は依然として配列内 (または逆参照するつもりがない場合は、その末尾を超えたもの) を指している必要があります。
そのため、コンパイラは、そのコードのように感じられるコードを生成できます。
p-1
割り当てた後に参照することはできません&k
。これは無効なポインターであり、使用時の動作は未定義です。
実行時エラーは、たとえば、保護されたメモリや、後で何らかの計算 (0) で除数になる場所など、エラーが発生する何かに浮遊ポインターがヒットした場合にのみ発生します。