【发布时间】:2019-02-24 12:13:44
【问题描述】:
如果我没有编译代码,我会说 1 和 2 给出相同的结果,因为它们都有一个 int指针 p 指向变量 age。在 1 和 2 中取消引用 age 应该会得到相同的结果。我也明白 3 只会给我变量 age 的第一个字节,因为它是 char 类型的。我无法解释为什么 1 和 2 给出不同的结果以及为什么 2 和 3 给出相同的结果。
1
int age = 20;
int* p = (int *)0x66FC9C;
printf("You're : %d\n", *p );
2
int age = 20;
int *p = &age;
printf("You're : %d\n", *p );
3
int age = 20;
char* p = (char *)0x66FC9C;
printf("You're %d\n", *p );
跟进
这很奇怪,因为当我这样做时:
int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d %d %d %d\n", *p, *(p+1), &age1, &age2 );
我实际上 打印 地址我总是得到正确的 p+1 (这意味着我可以预测地址)但如果我这样做:
int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d %d\n", *p, *(p+1) );
我永远猜不到。就好像 C 知道被监视了……咳咳双缝实验
【问题讨论】:
-
你意识到每次运行程序时变量的地址都会不同吗?
-
@Rotem,可能不同,不会。
-
阿里,为什么你认为
0x66FC9C是age的地址? -
@paxdiablo 更贴切地说,OP 不能假设
0x66FC9C包含他们声明的变量。 -
您不能确定
age将位于地址 0x66FC9C。如果编译器决定优化变量或将其放入 CPU 寄存器中,它甚至可能不在任何地址。