使用%p的C中变量的地址

时间:2018-04-15 10:13:28

标签: c pointers

例如,

int a = 6;
printf("%p", &a);

这会打印右边指针的地址吗? 但如果我们打印没有&?

怎么办?
int a = 6;
printf("%p", a);

有人可以告诉我它打印出来的东西吗?

2 个答案:

答案 0 :(得分:2)

根据C标准,向printf()发送错误的匹配类型参数是未定义的行为。并int!= void *,因此未定义的行为。

  

除非在以下详细说明中另有明确说明,否则以下每个陈述都适用:如果函数的参数具有无效值(例如函数域外的值,或者地址空间外的指针)程序,或空指针,或指向不可修改的存储的指针,当相应的参数不是const限定的)或类型(提升后)不具有可变数量的参数的函数,行为是未定义的。< / p>

Source

顺便说一下,你应该写printf("%p", (void *)&a);

的原因
warning: format specifies type 'void *' but the argument has type 'int *' [-Wformat-pedantic]
printf("%p", &a);
        ~~   ^~

答案 1 :(得分:2)

这是未定义的行为,因为%p需要void*

printf("%p", a);

允许添加显式转换,但行为是实现定义的:

printf("%p", (void*)a);

“实现定义”意味着编译器在将int转换为void*时可以随意执行任何操作。有关标准的准确引用,请参阅this Q&A

在许多实现中,您会看到指针指向intdemo 1)的数值。其他实现会警告您行为毫无意义。如果将警告视为错误,则代码将无法编译(demo 2)。