「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 非定数ポインターを使用して定数を変更すると、なぜ未定義の動作が発生するのでしょうか?

非定数ポインターを使用して定数を変更すると、なぜ未定義の動作が発生するのでしょうか?

2024 年 11 月 7 日に公開
ブラウズ:836

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

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

提供されたコード スニペットでは、動作に関する混乱を表しています。非 const ポインター (w) を介して定数整数 (e) を変更する場合:

const int e = 2;

int* w = (int*) &e;  // Casting to remove const-ness
*w = 5;            // Modifying the value pointed to by w

が指す値を変更する この変更を行った後、次のことがわかります。

  • w が指す値を表示します ( cout w
  • ただし、e (*cout

さらに、w が指すアドレスが e のアドレスと同じであることがわかります (cout cout w を通じて変更が行われたにもかかわらず、e がどのように変更されないのかという疑問が生じます。

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

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

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3