異なる値を出力する同一のアドレスを持つ変数
次のコード スニペットを考えてみましょう:
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;
驚くべきことに、このコードは出力:
40 65 0xbfacbe8c 0xbfacbe8c
同じアドレス (c1 と t) にある変数が 2 つの異なる値 ('A' と 65) を生成することはどのようにして可能ですか?
その説明は次のとおりです。未定義の動作の性質。この場合、定数変数 (*c1) を変更すると、未定義の動作が引き起こされます。 C 標準によれば、未定義の動作は、プログラムの終了から文書化された動作 (診断メッセージの有無にかかわらず) に至るまで、予測できない結果を引き起こす可能性があります。
この特定の例では、未定義の動作により、コンパイラはコードを最適化できます。予想外の方法。定数変数を変更することにより、コンパイラは a1 の元の値を効果的にオーバーライドします。ただし、この動作は保証されておらず、さまざまなコンパイラや環境によって異なる可能性があることに注意することが重要です。
したがって、定数変数およびポインタを使用する場合、予測可能なプログラムを保証するために、これらの変数の変更を避けることが重要です。行動。
以上がC で同じメモリ アドレスにある変数が異なる値を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。