1

我在同一台机器上多次运行这个程序。

#include <stdio.h>

int a = 0;
int main() {
  int b = 0;
  printf("%p %p\n", &a, &b);
}
  1. 每次打印变量的相同地址时ab它都会改变。我知道a会进入该.data部分,因此地址是固定的(如果我错了,请纠正我)但是为什么每次堆栈都会获得不同的地址?
  2. 所有这些地址都是虚拟的。是否可以从这些变量中获取物理地址?
  3. 如果一个全局变量被初始化为零,它会去哪里,BSS 还是数据?
4

1 回答 1

2
  1. @JonathanLeffler 已经提到堆栈地址会因地址空间布局随机化而发生变化。

要使全局变量的地址发生变化,还要使用 编译可执行文件-fpie并使用-fpie -pie.

有关更多详细信息,请参阅与位置无关的可执行文件 (PIE)


  1. 从用户空间不可能。即使您拥有在用户空间中没有多大用处的物理地址,因为它可能会因换出换入而改变。

  1. 通常零初始化数据进入 BSS。
于 2015-09-03T15:13:40.590 回答