2016-11-19 2 views
1

私は、変数の作成時に、スタック上のメモリ割り当ての順序を利用するの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 *に変換しました。

+0

'&c + 1'は有効なポインタではないため、逆参照することはできません。 –

+1

"私は未定義の動作のドメインに侵入していますか、それとも許可されていますか?" - どう思いますか?! –

+0

これが他の言語で動作するかどうかは、JavaScriptやMLで何が起こるか試してみることができますか? –

答えて

3

私はconst変数の値を変更できます。私は未定義の行動の領域に侵入していますか、それとも許されていますか?

前者は、あなたが知っているように、UBは何かを意味します。

私はプログラムが普通のものと同じ方法でconst変数を格納すると思います。

できます。時にはそうです。あなたはそれに頼るべきではありません。

コンパイラは、直接アクセスしようとすると値を変更できないようにするものです。私は、コンパイラがスタック変数(変数が格納されている)ではなく、const変数と非const変数を区別していると言っています。
私がこれを行うことができれば、誤ってconst変数の場所を指していると、変数の定数をどのように保証できるでしょうか?

あなたがUBの土地に挑戦しない限り、問題はありません。あなたがそうした場合、頼りになることはありません。

また、この同じプログラムは他の言語でも機能しますか(もちろん、構文に必要な変更を加えた後)?

確かに、すべての言語で非常によく似たようなものを書くことができます。直接メモリにアクセスできます。ほとんどの場合、ライブラリを経由して引き続きそのようなことをすることができます。

関連する問題