異なる値を生成する同じアドレスの変数
次のコード スニペットを考えてみましょう:
#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
どうやってそれが可能ですか同じアドレスの変数 a1 が 40 と 65 という 2 つの異なる値を生成しますか?
答え:
この動作は、未定義の動作の結果です。このコードは const 変数 (a1) の値を変更し、C の規則に違反します。 C 標準 (セクション 7.1.6.1 段落 4) によれば、const オブジェクトの存続期間中にそのオブジェクトを変更しようとすると、未定義の動作が発生します。
この場合、ポインタ c1 を介して const 変数 a1 を変更すると、次のようになります。予測できない結果。コンパイラーは、文書化された方法で変更や動作を無視したり、プログラムを終了したりする場合があります。
したがって、a1 が 2 つの異なる値を生成するという観察された動作は、未定義の動作の結果です。 const 変数の変更は強くお勧めできません。予期せぬ誤ったプログラムの動作につながる可能性があります。
以上がC では、同じメモリ アドレスにある const 変数が異なる値を示すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。