2012-04-29 85 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

一个运行时错误。

相关问题