我正在阅读一本操作系统教材,其中有一个示例可以验证系统是否支持虚拟地址,并且说以下程序每次都应该打印相同的结果。然而在我的MacBook Pro上,我看到了一些差异。
#include <stdio.h>
int var = 0;
int main(void)
{
var += 1;
printf("Address: %x, value: %d\n", &var, var);
return 0;
}
当我运行它时,我看到地址在某些字节中发生了变化(但并非所有字节):
./main
Address: e8c6018, value: 1
./main
Address: 9032018, value: 1
./main
Address: 1bc7018, value: 1
当我在GDB中运行时,我总是看到1018:
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19631) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19636) exited normally]
(gdb) r
Starting program: /Users/xilan/temp/main
Address: 1018, value: 1
[Inferior 1 (process 19654) exited normally]
那么直接运行和在GDB中运行有什么不同?为什么直接运行时我看到的地址不同?