【问题标题】:Why it is recommended to cast a pointer to a generic one before printing?为什么建议在打印之前将指针转换为通用指针?
【发布时间】:2014-06-29 06:03:07
【问题描述】:

好的,我听说你应该在打印之前将指针转换为通用指针,即void *,并且必须在printf 函数中练习使用%p 占位符而不是%d 来打印它们.

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

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

【问题讨论】:

  • 你能提供一些参考
  • @Amir,对不起,我没有听说过的参考资料。

标签: c pointers printf


【解决方案1】:

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

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

C99 7.19.6.1#7

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

C99 7.19.6.1#9

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2012-10-24
    • 2015-03-26
    • 2017-02-12
    • 1970-01-01
    • 2021-01-08
    相关资源
    最近更新 更多