コードを直接記述します。メモリを上書きするためにダブルポインタがint変数を指しています
#include <stdio.h>
struct A
{
int a;
int b;
};
int main()
{
struct A test;
double *p = (double *)&(test.a);
*p = 5;
printf("variable a: %d\n", &test.a);
printf("variable b: %d\n", &test.b);
return 0;
}
私はcentos7でこのコードを実行すると、コンパイラはgcc4.8.5
ある.AND私のコンピュータは、店にはほとんどエンディングを使用しています。ご覧のとおり
、変数b
のメモリが上書きされます、私はa
が0x0000 0005
で、b
が0x0000 0000
であると予想しました。
しかし、答えは次のとおりです。
variable a: 0
variable b: 1075052544
変数a
が0x 0000 0000
で、b
が0x4014 0000
あるのはなぜ?
これは未定義の動作です:
クランコンパイラは警告メッセージを生成します。また、 'double' 5は64ビット整数' 0x4014000000000000'に対応していますので、何が起きているのか分かります。ヒント: 'double'は' int'より大きくなります。 – unwind
あなたはあなたのコンパイラに嘘をついたので予期せぬ結果を得て、あなたに戻っていく方法を考え出しました。コンパイラに、 '&(test.a)'は 'double'のアドレスですが、整数のアドレスです。 – dasblinkenlight
最適化の設定を変えて、結果が* else *のコードをコンパイルするようにコンパイラを得ることができます。 –