我问过谷歌并对 StackOverflow 做了一些研究。我的问题是,当我main()
在 C++ 程序中输入函数并声明第一个变量时,为什么这个变量的地址会因不同的执行而不同?请参阅下面的示例程序:
#include <iostream>
int main() {
int *a = new int;
int *b = new int;
std::cout << "address: " << a << " " << b << std::endl;
std::cout << "address of locals: " << &a << " " << &b << std::endl;
return 0;
}
执行 1 的结果:
address: 0xa32010 0xa32030
address of locals: 0x7fff10de2cf0 0x7fff10de2cf8
执行 2 的结果:
address: 0x1668010 0x1668030
address of locals: 0x7ffc252ccd90 0x7ffc252ccd98
执行 3 的结果:
address: 0x10e0010 0x10e0030
address of locals: 0x7ffd3d2cf7f0 0x7ffd3d2cf7f8
正如你所看到的,我在不同的执行中得到不同的结果。输出的第一行对应于分配内存的地址,这应该发生在堆中——如果它们每次都分配不同的地址,这对我来说有点道理。然而,即使我打印了局部变量的地址——对应于第二行——结果仍然不同。
乍一看,我认为这是因为程序正在打印物理内存地址,但这篇文章Virtual Memory or Physical Memory反驳了我最初的想法。鉴于程序的执行是“相同的”,没有线程,没有用户输入等,是否有任何理由仍然存在具有不同地址的内存分配?
测试环境:
- Linux 14.04
- Mac OS X 10.10