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