同一アドレスが、異なる値を指している?
Posted: 2016年9月07日(水) 01:36
お世話になります。
C++における、const変数の挙動について解せない事があったので質問しました。
アドレスの値を変数に格納後、
格納した変数を使用してアドレスの指す変数を書き換えるといった方法で
const なデータの書き換えを行った際、
同一のアドレスが指す内容が変化する動作についてです。
プログラム中で、変数がどのようになっているのか分からず困っています。
書き換えられたデータは、どのように元の数値を保っているのでしょうか?
(ソースコード中では、dataが書き換え後も120として扱われている挙動)
constなデータの書き換えが目的ではないので、
const装飾子は、本来書き換えられては困るインスタンスに使用し、
外す必要がある場合は、const_castを使用するものと理解した上での質問です。
以上、よろしくお願い致します。
知識量:
C++11の入門書を読み終えた程度
OS:
Windows10 Pro
確認環境:
・Visual Studio Professional 2013
・Clang 3.8 / LLVM 3.8
出力例
C++における、const変数の挙動について解せない事があったので質問しました。
アドレスの値を変数に格納後、
格納した変数を使用してアドレスの指す変数を書き換えるといった方法で
const なデータの書き換えを行った際、
同一のアドレスが指す内容が変化する動作についてです。
プログラム中で、変数がどのようになっているのか分からず困っています。
書き換えられたデータは、どのように元の数値を保っているのでしょうか?
(ソースコード中では、dataが書き換え後も120として扱われている挙動)
constなデータの書き換えが目的ではないので、
const装飾子は、本来書き換えられては困るインスタンスに使用し、
外す必要がある場合は、const_castを使用するものと理解した上での質問です。
以上、よろしくお願い致します。
知識量:
C++11の入門書を読み終えた程度
OS:
Windows10 Pro
確認環境:
・Visual Studio Professional 2013
・Clang 3.8 / LLVM 3.8
/*
* const なデータをアドレス経由で書き換える実験
* 同じアドレスなのに、アクセス方法によって値が異なる現象
*/
#include <iostream>
int main()
{
using namespace std;
// 元になるconst変数
const int data = 120;
// アドレスを変数に落とす
intptr_t address = reinterpret_cast<intptr_t>(&data);
// アドレスを使用して内容を書き換える
(*reinterpret_cast<int*>(address)) = 100;
// 念のため両者のアドレスが一致するか確認する
if (&(*reinterpret_cast<int*>(address)) == &data)
{
// 表示してみる
cout << "アドレス一致" << endl;
cout << "アドレス:" << &(*reinterpret_cast<int*>(address))
<< "\t値:" << (*reinterpret_cast<int*>(address))
<< endl;
cout << "アドレス:" << &data
<< "\t値:" << data
<< endl;
}
// キー入力待ち
rewind(stdin), getchar();
return 0;
}