2017-04-16 45 views
1
#include<stdio.h> 
int main() 
{ 
    int x=10; 
    printf("value of x is %d\n",x); 
    printf("address of x is %d\n",&x); 
    printf("address of x is %p\n",&x); 

} 

ouptup:我不明白的第二个printf印刷

value of x is 10 
address of x is 2686748 
address of x is 0028FF1C  
+0

第二个'printf'是未定义行为。它可以做任何事情。 – aschepler

+1

我投票结束这个问题,因为你必须阅读手册 – stackptr

+0

为什么你不能理解它? 2686748十进制是0028FF1C十六进制。第二个printf()是UB是正确的,但我想理解为什么你问这个问题,因为第二个printf()输出与第三个printf()相同的值,用于相同的'&x'参数。 .. – ThingyWotsit

回答

1

第二和第三printf产生不确定的行为。

根据C99规格,

如果转换规范无效,则行为是不确定的。如果任何参数不是相应转换规范的正确类型,则行为是未定义的。

在这种情况下,不确定的行为可以这样解释:打印输出产生十六进制地址0028FF1C,这是2686748的十进制表示。

您可以通过添加一个转换void*固定第三printf

printf("address of x is %p\n", (void*)&x); 
+0

实际上,第二个和第三个'printf'调用UB。 – Olaf

+0

@Olaf你说得对,他正在将'int *'传递给'%p',它需要'void *'。谢谢! – dasblinkenlight

1
printf("address of x is %d\n",&x); 

这是不确定的行为,因为你不应该与%d符打印地址(&x)。相反,你的第三行是你必须使用的,除了你也需要投到void *,因为%p预计void *,而不是int *

第二个printf,顺便说一句,所有printf调用返回打印的字符数,所以在问题标题中使用单词“return”会引起误解。

退房文档 printf

0

2686748是十进制0028FF1C

+0

感谢您的回复 –

+0

不客气,先生!不管批评,不要放弃。所有疑问都很重要。你有没有找到你的答案? – lewohart

+0

是的,先生,我知道了 –

0

第二个printf你应该使用无符号整数(内存cannt是-ve号),,所以使用%你(如果我记得correclty。) 第三printf是正确的。

+0

第三行也调用UB。 – Olaf