为什么每次运行程序时都会返回不同的值?0x3759F8B0 - 0x100

bol*_*398 3 c++ memory-address

这对我来说不是一个问题,但我刚开始考虑它,我想我会问.为什么每次运行程序时返回不同的值(0x3759F8B0 - 0x100)?

有一次它说00AFFD00而下一个说006FFD48

test = 0x3759F8B0 - 0x100; 
cout << &test << endl;
Run Code Online (Sandbox Code Playgroud)

dat*_*olf 8

我想你的完整程序源读作为

#include <iostream>
using namespace std;
int main()
{
    int test;
    test = 0x3759F8B0 - 0x100; 
    cout << &test << endl;
}
Run Code Online (Sandbox Code Playgroud)

正如@pat在评论中已经提到的那样,你的程序会发出变量的地址test,而不是它的值.在现代操作系统上,有一种称为"地址空间布局随机化"的东西(ASLR,请参阅https://en.wikipedia.org/wiki/Address_space_layout_randomization以获得良好的概述),这有助于更难以利用可能存在的安全漏洞.程序.这个想法是,随着程序的每个新开始,它使用的东西的地址是随机的.因此,在启用ASLR的每次启动时,变量的地址都会发生变化.

ASLR现在是主流操作系统的标准功能.但是它可以被禁用(不推荐),如果没有ASLR,上述程序确实会发出相同的输出.