2016-11-19 107 views
1

我變量創建過程中利用的存儲器分配的堆棧上的爲了改變const int的的值。這裏的程序:通過指針c更改常量值++

//compiled this using C++14 standard on cpp.sh and on MinGW32 
#include <iostream> 
using namespace std; 
int main() 
{ 
    int c=5; 
    const int a(c); 
    cout<<(&c+1)<<endl<<&a<<endl; //Verifying if the addresses are the same 
    (*(&c+1))++; 
    cout<<a<<endl; 
} 

原來,我可以改變值的const變量。我是否進入未定義行爲的域名?還是允許?

我認爲程序以與正常方式相同的方式存儲const變量。當我嘗試直接訪問它時,編譯器會主動阻止我更改這些值。我的意思是說,編譯器區分const和非const變量,而不是堆棧本身(變量存儲在其上)。

如果我可以這樣做,如果我錯誤地指向const變量的位置,我將如何確保變量的一致性?

此外,作爲一個側面問題,同樣的程序是否也在其他語言中工作(當然,在對語法進行了必要的更改之後)?

注意:這與通過指針改變const值的其他問題有點不同。他們使用顯式轉換爲int *將指針轉換爲int *從const int *。

+0

'&c + 1'不是一個有效的指針,所以你不能解除引用。 –

+1

「我是否進入未定義行爲的域名?還是允許?」 - 你怎麼看?! –

+0

至於這是否適用於其他語言,那麼您能否嘗試查看JavaScript和ML中會發生什麼? –

回答

3

原來,我可以改變const變量的值。我是否進入未定義行爲的域名?還是允許?

前者,正如你所知道的UB意味着什麼。

我認爲程序以與正常方式相同的方式存儲const變量。

它可以。有時候,它確實如此。並不是說你應該依賴這一點。

當我嘗試直接訪問它時,編譯器會主動阻止我更改這些值。我的意思是說,編譯器區分const和非const變量,而不是堆棧本身(變量存儲在其上)。
如果我可以這樣做,如果我錯誤地指向const變量的位置,我將如何確保變量的一致性?

那麼,除非你冒險進入UB的土地,否則沒有問題。如果你這樣做,就沒有辦法。

此外,作爲一個側面的問題,同樣的程序是否也在其他語言中工作(當然,在對語法進行必要的修改之後)?

當然,你可以在所有允許直接訪問內存的語言中編寫非常相似的東西,而在大多數語言中,你可以通過庫並仍然執行這些惡意語言。