【问题标题】:Why type cast a void pointer?为什么要强制转换一个 void 指针?
【发布时间】:2013-06-03 21:14:59
【问题描述】:

作为 C 的新手,我从 void 指针中获得的唯一实际用途是用于可以在给定指针中存储不同数据类型的通用函数。因此,我在分配内存时没有对指针进行类型转换。

我看到一些代码示例有时使用 void 指针,但它们会进行类型转换。为什么这很有用?为什么不直接创建所需类型的指针而不是 void?

【问题讨论】:

  • 你能举个例子吗?
  • 您不需要从 void* 转换,因为该语言定义了从 void* 到任何其他类型指针的自动转换,但并非所有程序员都知道这一点(甚至不是所有 C不幸的是,图书作者)。
  • @larsmans 更准确地说,C 标准定义了 void * 所有 data 指针类型之间的隐式兼容性。函数指针不在游戏中(但是,如果您的系统是 POSIX,为什么任何理智的程序员会使用任何非 POSIX 的东西,那么函数指针也与 void * 兼容)。

标签: c types casting malloc


【解决方案1】:

在 C 中将 void 指针强制转换为另一种类型有两个原因。

  1. 如果你想访问指针所指向的东西 (*(int*)p = 42)
  2. 如果您实际上是在 C 和 C++ 的公共子集而不是“真正的”C 中编写代码。另请参阅 Do I cast the result of malloc?

1 的原因应该很明显。第二是因为 C++ 不允许将 void* 隐式转换为其他类型,而 C 允许。

【讨论】:

  • 但参数 2 无效:不应使用 C++ 编译器编译 C 代码。
  • @H2Co3: 是的,但有时您在宏或内联函数的头文件中定义了代码,这些代码可以在包含这些头文件的 C 和 C++ 代码中使用。
  • @H2CO3 尽管如此,还是有人这样做。我试图解释这一现象,而不是为其辩护。
  • 第三个原因:你被一个脑残的编码指南强迫了。 s/隐式转换/隐式转换/
  • @undur:“我只是听从命令”不算数。不过,在演员/转换方面做得很好。
【解决方案2】:

如果你想取消引用它们,你需要将 void 指针转换为其他东西,例如你得到一个 void 指针作为函数参数并且你确定这是一个整数:

void some_function(void * some_param) {
    int some_value = *some_param; /* won't work, you can't dereference a void pointer */
}

void some_function(void * some_param) {
    int some_value = *((int *) some_param); /* ok */
}

【讨论】:

  • 您不需要更易读(我更喜欢)的方法是int *tmp = param; int val = *tmp;
  • @H2CO3 如果指针是 void 类型,则必须这样做。就像纪尧姆的例子一样。
  • @Armin 您不必必须这样做,我再说一遍 - 如果将指针分配给临时变量,则可以避免强制转换。
  • @H2CO3 但是如果你不使用 temp ,你必须,如他的示例所示。
  • @Armin 没错,但这不是我要说的——我宁愿建议这不是全球不可避免的。
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 2016-08-07
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2014-04-01
  • 2018-03-05
相关资源
最近更新 更多