我直接放置代碼。雙指針指向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
。而我的電腦使用的小結局店。
正如你看到的,變量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 *。 –