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

C 为什么建议在打印之前将指针强制转换为通用指针?,c,pointers,printf,C,Pointers,Printf,好的,我听说过这样的事情:在打印之前,您应该将指针投射到一个通用指针,即void*,并且必须在printf函数中练习使用%p占位符,而不是%d,以便打印它们 我只是有一种感觉,这可能是为了防止在打印时截断大地址,或者是其他原因?但关键是,如果您在一台具有64位指针和32位整数的机器上;使用%p而不是%d仅能完成此任务 有人知道这种铸造技术有帮助的任何实际情况吗?因为%p说明符的规格是打印void*。它不知道如何打印任何其他类型的指针 使用printf调用方必须将参数转换为正确的类型;printf

好的,我听说过这样的事情:在打印之前,您应该将指针投射到一个通用指针,即
void*
,并且必须在
printf
函数中练习使用
%p
占位符,而不是
%d
,以便打印它们

我只是有一种感觉,这可能是为了防止在打印时截断大地址,或者是其他原因?但关键是,如果您在一台具有64位指针和32位整数的机器上;使用
%p
而不是
%d
仅能完成此任务


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

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

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

C99 7.19.6.1#7

p参数应是指向void的指针。指针的值为 在定义的实现中转换为打印字符序列 态度

C99 7.19.6.1#9

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

“未定义的行为”意味着任何事情都可能发生。实际上,如果您传递的指针与
void*
具有相同的大小和表示形式,您可能会侥幸逃脱。但你不应该依赖未定义的行为

在现代系统中,所有对象指针(即不是函数指针)都具有相同的大小和表示形式。如果您知道您在这样一个系统上,并且如果程序出现错误并不重要,那么您可能会通过传递错误的指针类型而侥幸逃脱


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

您能给出一些建议吗reference@Amir,很抱歉,我没有我听说过的参考资料。