2011-08-21 58 views
1

http://www.ideone.com/kRaMj關於const如何修改存儲行爲的說明

我在algogeeks論壇中發現了這個問題。任何人都可以解釋i的值是如何仍然0,但*p顯示2雖然他們的地址是相同的。

#include<stdio.h> 

int main() 
{ 
    const int i = 0; 
    int * p ; 
    p = (int *) & i; 
    *p = 2; 

    printf("(i,p): %x %x \n",&i,p); 
    printf("(i,p): %d %d \n",i,*p); 
} 

的程序的輸出是:

(i,p): bfdf6234 bfdf6234 
(i,p): 0 2 
+0

請包括問題中的代碼,而不是發佈鏈接 –

+0

@Nikhil:請儘量保持Q/Answers ** self contained **,這是很好的,你在這裏發佈鏈接到Ideone上的代碼,但是重複它也是在這裏,原因是如果由於某些原因該鏈接在將來變得無效,則Q仍然有效,並且對它的回答將有助於其他人。 –

+0

很抱歉張貼鏈接而不是實際的代碼。請記住將來的帖子。 – Nikhil

回答

9

即代碼引起未定義的行爲。
使用指向p的指針更改常量變量i的值後,所有投注都將關閉,並且可能會看到任何行爲。

未定義的行爲意味着任何事情都可能發生,行爲不能被解釋爲標準,它定義了語言的規則並沒有定義任何行爲。

+3

夠正確。雖然在這種情況下,顯然編譯器假定你不修改'const' int,只是將常量0傳播到'printf'中。 – Nemo