2015-09-06 63 views
0
int main(void) 
{ 
    int n1 = 2, n2 = 5; 
    int *p = &n1, *q = &n2; 
    *p = *(q++); 
    printf("%d,%d", *p, *q); 
    return 0; 
} 

输出= 5,5指针递增是如何工作的

为什么的*q值是5,应该有一些垃圾的价值?

INT主要(无效)

{ 

    int n1 = 2, n2 = 5; 

    int *p = &n1, *q = &n2; 

    *p = *(++q); 

    printf("%d,%d", *p, *q); 

    return 0; 

} 

输出= 2,2

怎么会这样呢? 任何人都可以解释优先级规则如何在指针中工作吗?

+6

是什么让你觉得5不是'一些垃圾价值'? – ach

+0

因为这个巧合可能会发生1或2次,但不是每次我运行程序时........ –

+0

没有理由说明程序在每次运行时都不应该产生一致的结果。 '垃圾值'并不意味着有一个随机数生成器来生成它。它意味着程序在堆栈上执行的其他活动中剩下的某种东西。在每次运行都执行相同活动的程序中,该剩余物可能也是一样的。 – ach

回答

6

*p = *(q++);(或多或少)相当于*p = *q; q++;,所以p是好的。 q++将被评估,产生旧值q(即值预增量)。你看到的是预期的行为。

您在printf调用中对q的推定存在未定义的行为,但由于q不再指向您在此时拥有的内存。一百万种不同的东西可能会导致这种情况(例如,最后一次分配内存,可能有5个,编译器太好了,并试图帮助你,等等),但你不能也不应该依赖这种行为。这样做是危险的,这个程序可能会在许多编译器/操作系统/硬件上崩溃或输出废话。

+0

@ChrisBeck呃,不知道我错过了那个。会相应更新。 – Corbin

+2

但是,当他接着'printf'的值是'* q',那就是UB,因为'q'增加了,并没有指向任何有效的东西。@Corbin:是的,这是一个奇怪的例子。 –

1

为什么* q的值是5它应该有一些垃圾值?

这是由于在所述*(q++)后缀递增其中指针引用和分配给后*p作用。

所以,通过*q指向的地址的当前值分配给*p然后q被递增到“垃圾值”

在打印5,5这个奇怪的结果是未定义的行为。