ホームページ  >  記事  >  バックエンド開発  >  非定数ポインタを介して定数を変更すると未定義の動作が発生するのはなぜですか?

非定数ポインタを介して定数を変更すると未定義の動作が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 05:31:02815ブラウズ

Why Does Modifying a Constant through a Non-const Pointer Produce Undefined Behavior?

非定数ポインターを使用した定数の変更: 未定義の動作の詳細

提供されたコード スニペットでは、動作に関する混乱を表現しています。非 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 (cout << w << endl;) が指す値を表示すると、期待どおり 5 が出力されます。
  • しかし、e (*cout << e <

さらに気づくでしょう。 w が指すアドレスが e のアドレスと同じであること (cout << "w = " << w << endl ;cout << "&e = " <<<w を通じて変更が行われたにもかかわらず、e がどのように変更されないのかという疑問が生じます。

この動作は、非定義のパラメータを介して定数を変更するときに発生する未定義の動作に起因します。 -const ポインタ。このような変更を行うと、コードは未定義の動作の領域に入り、予測不能になり、特定の実装の詳細に依存します。

この場合、w による変更は、実行時の e の一時コピーですが、元の e は変更されません。その理由は、e がコンパイル時の定数として扱われ、その値がバイナリ コードにハードコーディングされるためです。したがって、w に対する実行時の変更は、元の e には影響しません。

この動作は、使用される実装に固有のものであり、依存すべきではありません。非 const ポインターを使用して定数データを変更することは悪い習慣であると考えられているため、避けるべきです。正しいアプローチは、非定数参照を使用するか、変更するデータの非定数コピーを作成することです。

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

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