打印整数值时出现意外输出

时间:2015-01-03 10:37:43

标签: c pointers gcc compiler-errors

#include<stdio.h>
void main()
{
   int i = 5;
   printf("%p",i);
}

我尝试在Linux上使用GCC编译器编译这个程序,在编译程序时会发出警告说

%p expects a void* pointer 

并且当运行时输出为46600x3。

但是当我使用网站codingground.tutorialspoint.com在线编译时,我得到一个输出 等于0x5即十六进制输出,有人可以解释原因吗?

2 个答案:

答案 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 */
}