我有一个小代码片段如下:
```html
```html
我有一个小代码片段如下:
```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
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
- Francesco Laurita