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

前端之家收集整理的这篇文章主要介绍了为什么建议在打印前将指针强制转换为通用指针?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好吧,我听说你应该在打印它之前把指针指向一个通用的指针,即void *,并且必须在printf函数中练习使用%p占位符代替%d来打印它们.

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

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

解决方法

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

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

C99 7.19.6.1#7

p The argument shall be a pointer to void. The value of the pointer is
converted to a sequence of printing characters,in an implementation-defined
manner.

C99 7.19.6.1#9

If any argument is not the correct type for the corresponding conversion specification,the behavior is undefined.

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

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

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

猜你在找的C&C++相关文章