我的代码片段如下:
char global=100;
void main()
{
char p = NULL;
printf("%p\n", &p);
printf("%p\n", &global);
}
在编译并生成二进制可执行映像后,在每次执行相同的二进制可执行文件时,我会看到本地变量p
的不同虚拟内存地址。
但是,全局变量global
的虚拟内存地址保持不变。
我理解C内存布局;并且我希望在每次执行时使用相同的二进制映像为给定变量提供相同的内存位置。
在运行时为局部变量分配的虚拟地址的原因是什么? 只有一个函数,没有机会改变函数的执行顺序,从而改变堆栈内存布局。
运行此程序的结果4次:
0x7fff181b4b2f
0x601034
0x7ffe34abd62f
0x601034
0x7ffe2813b98f
0x601034
0x7fffcef6b52f
0x601034
答案 0 :(得分:5)
这通常是由address space layout randomization引起的。它是一种安全技术,旨在防止某些类型的攻击,例如buffer overflow。
托管环境中的局部变量通常存储在堆栈中。在这种情况下,堆栈的虚拟内存地址会发生变化,以便尝试超出缓冲区并运行任意代码的人无法预测恶意代码的显示位置。