gpt4 book ai didi

c - printf() 在c 中用%p 格式打印的地址是哪个?

转载 作者:IT王子 更新时间:2023-10-29 00:23:41 26 4
gpt4 key购买 nike

我有如下简单的代码:

#include<stdio.h>

int glob;

int main(void)
{
int a;
printf("&a is : %p \n", &a);
printf("glob is : %p \n", &glob);
return 0;
}

以上程序的输出是:第一次运行:

&a is : 0x7fff70de91ec
glob is : 0x6008f4

第二次运行:

&a is : 0x7fff38c4c7ac
glob is : 0x6008f4

我正在研究虚拟地址和物理地址。我有以下问题:

  1. 变量“a”的打印地址(物理/虚拟)是什么?
  2. 如果它是虚拟的,那么它在每次运行同一个程序时如何变化?据我了解,编译器会在编译时为变量提供虚拟地址?
  3. 为什么程序每次运行时全局变量的地址都是常量?

在 Linux 上执行此程序:2.6.18-308.el5 x86_64 GNU/Linux

编译使用:gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-52)

最佳答案

这两个地址都是虚拟的。

现代系统使用堆栈随机化来防止所谓的堆栈粉碎攻击,这就是局部变量可以在每次运行时更改其位置的原因。然而,全局变量存储在可执行文件中,并且每次都以相同的偏移量加载。

关于c - printf() 在c 中用%p 格式打印的地址是哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15833283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com