変数アドレスの不一致の謎を明らかにする: 未定義の動作へのダイブ
変数の複雑な領域では、独特の疑問が生じます。同じアドレスにある変数が 2 つの異なる値を生成することは可能ですか?この謎を解明するために、この異常な動作を示すコード スニペットを詳しく調べてみましょう。
次の C コードを考えてみましょう:
#include <iostream> using namespace std; int main(void) { 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; return 0; }
驚くべきことに、このコードの出力では矛盾が明らかになります。
40 65 0xbfacbe8c 0xbfacbe8c
const として宣言された変数 'a1'、は、元の値 40 を保持します。ただし、「b1」と同じメモリ位置を指すポインタ「t」は、値 65 (ASCII の「A」) を示します。これはどのようにして可能なのでしょうか?
その答えは、未定義の動作の概念にあります。この場合、const 変数 (この例では「a1」) を変更すると、C 標準 (7.1.6.1) に従って未定義の動作がトリガーされます。その結果、結果は予測不能になり、コンパイラが異なれば、あるいは同じコードの実行が異なると異なる場合もあります。
C 標準では、「有効期間中に const オブジェクトを変更しようとすると、未定義の動作が発生する」と明確に述べられています。 。」言い換えれば、そのような変更の動作は言語によって定義されておらず、任意の結果が生じる可能性があります。
この特定の例では、'c1' が指す文字の変更 (これは同じです)メモリの場所を 'a1' として指定すると、't' を通じて取得した値に予期しない変更が発生します。これは、'char' と 'int' の間の型変換により、そのメモリ位置に格納されているデータの解釈が効果的に再定義されるためです。
未定義の動作はさまざまな場面で現れる可能性があることに注意することが重要です。状況を完全に無視する、診断メッセージを生成する、プログラムを終了するなどの方法があります。したがって、予測可能で信頼性の高いプログラムの実行を保証するには、運用コードで未定義の動作の呼び出しを回避することが重要です。
以上がC では、同じメモリ アドレスにある変数が 2 つの異なる値を持つにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。