2015-09-06 123 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這個奇怪的結果是未定義的行爲。