#include<stdio.h>
void main()
{
int i = 5;
printf("%p",i);
}
我尝试在Linux上使用GCC编译器编译这个程序,在编译程序时会发出警告说
%p expects a void* pointer
并且当运行时输出为46600x3。
但是当我使用网站codingground.tutorialspoint.com在线编译时,我得到一个输出
等于0x5
即十六进制输出,有人可以解释原因吗?
答案 0 :(得分:6)
%p
期望某事物(或指针)的地址。您提供变量i
的值而不是地址。使用
printf("%p",(void*)&i);
而不是
printf("%p",i);
并且GCC将在没有警告的情况下编译程序,它将在您运行时打印存储i
的地址。 &符号(&
)是地址运算符,它给出变量的地址。由于格式说明符%p
期望参数类型为void*
,而&i
类型为int*
,因此强制转换也是必要的。
printf("%d",i);
使用错误的格式说明符将导致UB(Undefined Behavior)
答案 1 :(得分:4)
printf("%p",i);
使用错误的格式说明符将导致未定义的行为。 %p
预计在您的情况下,void *
类型的争论是传递i
的值,而不是地址,以便打印出您应该传递的地址&i
你应该使用
printf("%d",i);
打印整数值i
代码应该像
#include<stdio.h>
void main()
{
int i = 5;
printf("%d",i); /* To print value of i */
printf("%p",(void *)&i); /* Address of variable i */
}