私は、変数の作成時に、スタック上のメモリ割り当ての順序を利用するのconst int型の値を変更する.Hereのプログラム:ポインタCを介してconstの値を変更する++
//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 *に変換しました。
'&c + 1'は有効なポインタではないため、逆参照することはできません。 –
"私は未定義の動作のドメインに侵入していますか、それとも許可されていますか?" - どう思いますか?! –
これが他の言語で動作するかどうかは、JavaScriptやMLで何が起こるか試してみることができますか? –