我有以下代码,
...
char* seg = mmap(0, ...)
printf("seg=%x\n", seg);
...
Run Code Online (Sandbox Code Playgroud)
该程序打印带有seg=b7ffd000. 而在 gdb 中(对于相同的执行),当使用 时p/x seg,它会打印$2 = 0x0. 我在这里很困惑。这不是同一个var吗seg?为什么价值观不同。
PS:在 中mmap,第一个参数是映射内存的优选地址,返回值是映射内存的实际地址。
既然你已经在评论中回答了我的问题,我可以回答了!
您看到的结果值printf是真实地址。您在调试器中看到0的是 的值seg,因为启用优化后,编译器可以自由地执行各种奇怪的操作(这通常会使逐步调试变得棘手)。不过,“可观察”的行为应该始终是正确的(假设您不依赖于任何未定义的行为)。