【问题标题】:C pointers - Reading values from absolute addresses vs AddressOf operator (&)C 指针 - 从绝对地址读取值与 AddressOf 运算符 (&)
【发布时间】:2019-02-24 12:13:44
【问题描述】:

如果我没有编译代码,我会说 12 给出相同的结果,因为它们都有一个 int指针 p 指向变量 age。在 12 中取消引用 age 应该会得到相同的结果。我也明白 3 只会给我变量 age 的第一个字节,因为它是 char 类型的。我无法解释为什么 12 给出不同的结果以及为什么 23 给出相同的结果。

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,可能不同,不会。
  • 阿里,为什么你认为0x66FC9Cage的地址?
  • @paxdiablo 更贴切地说,OP 不能假设 0x66FC9C 包含他们声明的变量。
  • 您不能确定age 将位于地址 0x66FC9C。如果编译器决定优化变量或将其放入 CPU 寄存器中,它甚至可能不在任何地址。

标签: c pointers memory


【解决方案1】:

你试图欺骗编译器,它看起来比你聪明......

更重要的是,除非您真的了解编译器的内部结构,否则永远不要试图猜测它将如何翻译您的源代码。通常在您的最后一个示例中,编译器可以很容易地看到 age1 变量从未使用过(至少从未以一致的方式使用)。所以它可以优化它。如果您真的想更好地理解这里发生了什么,您将不得不要求编译器生成它内部生成的汇编语言并阅读它。您将看到一个变量是否已被优化(因为它没有生成),或者它是否与另一个变量不连续。

无论如何,尝试更好地理解编译器的作用是件好事,但请永远不要在生产代码中这样做。

【讨论】:

    【解决方案2】:

    谁知道age的地址是0x66FC9C?如果不是,则不能保证 1 和 2 的结果相同。可以对 2 和 3 进行等效推理。

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多