我无法理解第二张printf印刷的内容

时间:2017-04-16 15:06:34

标签: c printf memory-address

#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    

4 个答案:

答案 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 是正确的。