为什么建议在打印前将指针强制转换为通用指针?

时间:2014-06-29 06:03:07

标签: c pointers printf

好的,我听说过你应该在打印它之前指向一个通用的指针void *,并且必须在%p中使用%d占位符代替printf {1}}打印它们的功能。

我只是觉得可以在打印时防止截断大地址,或者是其他什么?但重点是,如果你在一台机器上有 64 位指针和 32 位整数;使用%p代替%d将完全胜任。

是否有人知道这种铸造技术有用的任何实际情况?

1 个答案:

答案 0 :(得分:10)

因为%p说明符的规范是打印void *。它不知道如何打印任何其他类型的指针。

使用printf时,调用者必须将参数转换为正确的类型; printf函数无法执行任何转换,因为它无法访问有关您实际传入的参数的类型信息。它只能假设您传递了正确的参数。

C99 7.19.6.1#7

  

p 参数应该是指向void的指针。指针的值是       转换为一系列打印字符,在实现定义中       方式。

C99 7.19.6.1#9

  

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

“未定义的行为”意味着任何事情都可能发生。在实践中,如果您传递的指针具有与void *相同的大小和表示,则可能会使用它。但你不应该依赖未定义的行为。

在现代系统中,所有对象指针(即非函数指针)具有相同的大小和表示。如果你知道你在这样的系统上,并且如果程序行为不正常并不重要,那么你可能会通过传递错误的指针类型而逃脱。

重要的一点是,如果您尝试打印函数指针;因为现代系统的函数指针与对象指针的大小不同。不能保证编译器允许向void *转换函数指针,但至少在尝试时会收到编译器错误消息。