#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:
value of x is 10
address of x is 2686748
address of x is 0028FF1C
答案 0 :(得分:1)
第二个和第三个printf
产生未定义的行为。
根据C99规范,
如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。
在这种情况下,可以解释未定义的行为:打印输出生成十六进制地址0028FF1C
的十进制表示,即2686748
。
您可以通过向printf
添加转化来修复第三个void*
:
printf("address of x is %p\n", (void*)&x);
答案 1 :(得分:1)
printf("address of x is %d\n",&x);
这是未定义的行为,因为您不应该使用&x
说明符打印地址(%d
)。相反,你的第三行是你必须使用的,除了你还需要转换为void *
,因为%p
期望void *
,而不是int *
。
顺便说一下,第二个printf和所有printf
次调用都会返回打印的字符数,因此您使用的单词&#34; return&#34;在你的问题标题中有误导性。
查看文档
printf
答案 2 :(得分:0)
2686748是0028FF1C的小数
答案 3 :(得分:0)
second printf 你应该使用 无符号整数 (内存不能是-ve数字),所以请使用%u(如果我记得的话) 。) 第三个 printf 是正确的。