我有简单的代码如下:上述程序的哪个地址是printf()在c中用%p格式打印的地址?
#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
我学约虚拟&物理地址。我有以下问题:
- 哪个是变量“a”的打印地址(物理/虚拟)?
- 如果它是虚拟的,那么它在同一个程序的每次运行中如何变化? 正如我所理解的编译器提供虚拟地址变量在编译时?
- 为什么全局变量的地址在程序的每次运行中都是不变的?
在执行在Linux此程序:2.6.18-308.el5 x86_64的GNU/Linux的
使用编译:gcc版本4.1.2 20080704(红帽4.1.2-52)
你的程序调用**未定义的行为**。一个'%p'必须被赋予一个ptr-void,所以你必须在这两个printf中投射到'(void *)'。 – Jens 2013-04-05 12:09:01
@Jens这个参数不会被隐式转换为void *'吗? – 2013-04-05 12:54:38
@VilhelmGray隐式转换在需要类型时发生,但在可变参数函数中没有类型。 – effeffe 2013-04-05 13:45:29