同じアドレスで値を変更する変数: 未定義の動作を理解する
C では、異なるデータ型の変数が同じメモリ アドレスを占有することができます。予想外の結果につながります。次のコードを考えてみましょう。
const int a1 = 40; const int* b1 = &a1; char* c1 = (char *)(b1); *c1 = 'A'; int *t = (int*)c1; cout << a1 << " " << *t << endl; cout << &a1 << " " << t << endl;
このコードを実行すると、a1 と *t の両方の値が 40 になり、&a1 と t のアドレスが同じになることが予想されます。ただし、出力は驚くべきものです:
40 65 0xbfacbe8c 0xbfacbe8c
同じアドレスにある変数が 2 つの異なる値を生成することはどのように可能ですか?
説明
この動作は、コード内の未定義の動作が原因で発生します。具体的には、a1 のような const 変数の変更は未定義の動作です。 C 標準 (セクション 7.1.6.1) では、const オブジェクトの存続期間中にそのオブジェクトを変更しようとすると、未定義の動作が発生することが明示的に規定されています。
この場合、*c1 (a1 を指す) を変更することで、次のようになります。 const 変数を効果的に変更しました。これが、コンパイラが期待される動作を保証できず、代わりに予測不可能な結果を生成する理由です。
そのような場合に考えられる動作は、標準のセクション 1.3.24 で指定されています。これらは、状況を完全に無視することから、エラー メッセージを表示してプログラムを終了することまで多岐にわたります。この場合、コンパイラは a1 と *t に異なる値を生成することを選択しました。
結論
C コードでは未定義の動作を避ける必要があります。予期せぬ一貫性のない結果が生じる可能性があります。この特定のシナリオでは、別の型のポインターを介して const 変数にアクセスし、それを変更すると、未定義の動作と予測できない出力が発生しました。
以上が異なる型のポインターを介して「const」変数を変更すると、C で未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。