ホームページ  >  記事  >  バックエンド開発  >  非 const ポインタを使用して「const」値を変更すると、未定義の動作が発生するのに、ポインタと元の変数に異なる値が出力されるのはなぜですか?

非 const ポインタを使用して「const」値を変更すると、未定義の動作が発生するのに、ポインタと元の変数に異なる値が出力されるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 04:47:02227ブラウズ

Why does modifying a `const` value through a non-const pointer lead to undefined behavior but still print different values for the pointer and the original variable?

非 const ポインターを使用した const の変更

次のコードを考えてみましょう。

<code class="cpp">const int e = 2;

int* w = (int*) &e;          // (1) cast to remove const-ness
*w = 5;                        // (2)

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2

cout << "w = " << w << endl;   // (5) w points to the address of e
cout << "&e = " << &e << endl;</code>

In (1 )、w は e のアドレスを指します。 (2)ではその値を5に変更していますが、*wとeの値が表示されるとそれぞれの値が異なります。しかし、ポインタ w と e のアドレスを出力すると、それらは同じ値になります。

e が 5 に変更されたとしても、なぜ 2 が残っているのでしょうか?別の場所に保管されていたのでしょうか?それとも一時的なものですか?しかし、なぜ w が指す値は e のアドレスのままなのでしょうか?

答え

const 値を変更すると、未定義の動作領域に入ります。ただし、推測するには:

  • (3) および (4): *w は実行時に評価され、e はコンパイル時の定数として扱われます。したがって、出力される値は異なります。

以上が非 const ポインタを使用して「const」値を変更すると、未定義の動作が発生するのに、ポインタと元の変数に異なる値が出力されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。