運行下面的代碼顯示& x = ptr,那麼x和* ptr怎麼不等於?在C++中修改一個const int
const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;
cout << &x << " " << x << " " << ptr <<" " <<*ptr; //output : 0012FF60 10 0012FF60 11
運行下面的代碼顯示& x = ptr,那麼x和* ptr怎麼不等於?在C++中修改一個const int
const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;
cout << &x << " " << x << " " << ptr <<" " <<*ptr; //output : 0012FF60 10 0012FF60 11
只有遵循規則,C++實現才能使程序工作。你違反了規則。 C++實現可能的表現是這樣的:
x
聲明const
,C++實現知道只要你遵守規則的值不能改變。因此,無論使用哪一個x
,C++實現都會使用10,而不會打擾檢查x
是否已更改。*ptr
指向一個非常量int
,存儲並從中讀取實際上執行。這些「工作」,因爲它指向的內存(其中x
表示)實際上並未被操作系統標記爲只讀。因此,儘管您不應該這樣做,但您仍可以進行修改。注意到如果遵守規則,則C++實現的行爲將起作用。如果你沒有修改x
,那麼使用10代表x
,無論它出現在哪裏都可以正常工作。或者,如果您還沒有聲明x
爲const
,那麼C++實現將不會假定它始終爲10,所以只要訪問了x
就會得到更改的值。這是所有C++標準對實現的要求:如果遵循規則,它就會工作。
當您不遵守規則時,C++實現可能會以看似不一致的方式破壞。
您正在修改一個聲明爲const
的對象。這是未定義的行爲;該程序不需要做任何明智的事情。它看起來可以正常工作,或者給出錯誤的答案或segfault,或者執行攻擊者提供的任意代碼。通常的誇張之處在於,該程序允許demons飛出你的鼻子。
能否詳細說明一下? 「什麼都可能發生」是什麼意思? – Nazgol
@Nazgol:這意味着語言標準沒有提到代碼的行爲。在最糟糕的情況下,它的行爲可能與您預期的完全相同(這是最糟糕的情況,因爲這意味着很難追蹤到這個錯誤)。 –
@Nazgol事情可能會起作用。事情可能會破裂。你可能會崩潰。您的硬盤可能會被格式化。真的,任何事 - 當它發生時,它不會令人愉快。 –
@ user376507:它不完全是重複的,因爲這是關於C++的,而另一個關於C的,但它恰好在這兩種語言中都是相同的問題。 –
C++ 11參考:https://timsong-cpp.github.io/cppwp/n3337/dcl.type.cv#4。 –