非定数ポインターを使用した定数の変更: 未定義の動作の詳細
提供されたコード スニペットでは、動作に関する混乱を表現しています。非 const ポインター (w) を介して定数整数 (e) を変更する例:
<code class="cpp">const int e = 2; int* w = (int*) &e; // Casting to remove const-ness *w = 5; // Modifying the value pointed to by w</code>
この変更を行った後、次のことがわかります。
さらに気づくでしょう。 w が指すアドレスが e のアドレスと同じであること (cout << "w = " << w << endl ;cout << "&e = " <<<
この動作は、非定義のパラメータを介して定数を変更するときに発生する未定義の動作に起因します。 -const ポインタ。このような変更を行うと、コードは未定義の動作の領域に入り、予測不能になり、特定の実装の詳細に依存します。
この場合、w による変更は、実行時の e の一時コピーですが、元の e は変更されません。その理由は、e がコンパイル時の定数として扱われ、その値がバイナリ コードにハードコーディングされるためです。したがって、w に対する実行時の変更は、元の e には影響しません。
この動作は、使用される実装に固有のものであり、依存すべきではありません。非 const ポインターを使用して定数データを変更することは悪い習慣であると考えられているため、避けるべきです。正しいアプローチは、非定数参照を使用するか、変更するデータの非定数コピーを作成することです。
以上が非定数ポインタを介して定数を変更すると未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。