可以硬编码地址并手动将其分配给指针吗?

Can hard-code address and manually assign it to a pointer?

当我编译这段代码时:

int main() {

  int a = 10;
  int *p = &a;

  printf("%p",p) // or printf("%p",&a);

  return 0;
}

它打印 0022ff38。 然后这段代码:

int a=10;
int *p =(int *)0x22ff38;

printf("%d",*p); //does not output 10;

应该打印 10,但它输出了另一个东西(2293560)

但是当我编辑代码时,添加一行:

  int main() {

  int a = 10;
  int *p =(int *)0x22ff38;
  
  printf("%p",&a);
  printf("%d",*p); // Now it prints correctly:10

  return 0;
}

一切正常!

Questions:

  1. 为什么我的代码在第一个代码中没有输出 a 值?
  2. 这种寻址指针的用法是什么?有用吗?

编辑: 我在 Linux 中没有问题,因为在 Linux 中,每次我 运行 代码时,变量地址都会改变并且程序输出 segmentation fault。但在 windows 中地址保持不变,预计 手动寻址 在 windows.

中工作

编译器比你想象的要聪明。例如,给定此代码:

int main() {
  int a=10;
  int *p =(int *)0x22ff38;

  printf("%d",*p);
}

编译器会发现 a 从未被使用过。所以它永远不会为它实际分配任何内存。

如果添加 printf("%d", a),编译器可能只会将 a 放入寄存器中,而不会放入内存中。

从根本上说,您不能假设两个程序会将变量放在内存中的同一位置。