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

dar*_*rix 7 c printf pointers

好的,我听说你应该把一个指针指向一个普通的指针,即void *在打印它之前,必须练习使用%p占位符而不是%dprintf打印它们的函数中.

我只是觉得可以在打印时防止截断大地址,或者是其他什么?但关键是如果你在一台64位指针和32位整数的机器上; 使用%p而不是%d将完成这项工作.

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

M.M*_*M.M 10

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

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

C99 7.19.6.1#7

p参数应该是指向void的指针.指针的值以实现定义的方式转换为打印字符序列.

C99 7.19.6.1#9

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

"未定义的行为"意味着任何事情都可能发生.实际上,如果你传递的指针具有相同的大小和表示,你可能会逃脱它void *.但是你不应该依赖未定义的行为.

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

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