2016-05-16 20 views
0

const_castの後、値はmain関数で変更されません。しかし、外部関数を呼び出すときに変更されても、メインに古い値が出力されます(const intが最初に初期化されます)。const_castは値を変更しません

int main() { 
    const int i = 5; 
    int* p = const_cast<int*>(&i); 
    *p = 22; 
    std::cout<<i; 
    return 0; 
} 

出力は5です。なぜですか?ウォッチ・ウィンドウはi = 22の値を示しています

Watch-window value

、なぜそれが5を印刷していますか?値がChangeValue関数を呼び出した後であっても値が変化した場合に変更されないのはなぜ

void ChangeValue(const int i) { 
    int* p = const_cast<int*>(&i); 
    *p = 22; 
    std::cout<<i; //Here the value changes to 22 
} 

int main() { 
    const int i = 5; 
    ChangeValue(i); //Value changes to 22 in the ChangeValue function 
    std::cout<<i // It again prints 5. 
} 

:私は外部関数を呼び出す場合、出力は異なりますか?

Linuxプラットフォームで同じ出力が得られます。誰かが私の混乱をはっきりさせてくれますか?

答えて

3

定数値を変更しようとすると、の未定義の動作が発生します。

なぜ変わらないのかについては、コンパイラはコンパイル時定数であるとみなし、それを読み取り専用セグメントに格納することができます。第2のプログラムについて


変数iが読み取り専用セグメントに格納することができない、それは他のローカル変数のようなスタックに保存されています。ただし、iを修正しようとしている定数としてマークしたので、はまだ未定義の動作です。あなたはそれがChangeValue関数内のローカル変数iにコピーされます意味する値によって変数を渡すため

mainプログラムは、古い値を出力する理由は、あります。変数がmainまたはChangeValue関数の定数でなかった場合、main関数のiの値はのままで、の値は変更されません。

ChangeValue関数を変更してその引数を参照すると、最初のプログラムと同じ動作になることがあります。

+1

* "読み取り専用セグメントに格納する可能性があります" * - SIGSEGVなどの可能性があります。 "5"が表示されているのは、書き込みが試行されたときに 'i'の値の内部レコードを更新しない(*未定義の動作*のコードの影響をモデル化する義務はない) cout << i'であり、値の元の変更されていないレコードを使用して、<<(std :: ostream&、int)によって期待されるレジスタまたはスタック位置をロードします。 –

関連する問題