【问题标题】:`void *` to other pointer`void *` 指向其他指针
【发布时间】:2012-03-15 11:57:11
【问题描述】:

如果我将void *vptr 传递给以other_type *ptr 作为参数的函数,vptr 会自动转换为other_type * 吗?这是代码,

typedef struct A {
    //...
}A;

void bar(A *a)
{
    //do something with a
}

int main()
{
    A a = {..};
    void *vp = &a;
    bar(vp);  //will vp be converted to A*?
}

我的代码安全还是正确?

【问题讨论】:

  • 你得到什么结果?错误,警告?

标签: c void-pointers


【解决方案1】:

是的,void* 可以隐式转换为任何指针类型,任何指针类型都可以隐式转换为void*。这就是为什么您不需要(也不应该)转换 malloc 的返回值的原因,例如。

【讨论】:

  • 那么,我的代码是正确的吗?我的意思是我不必在 other_type 上执行 (void *) 之类的操作,也不必在 void * 上执行 (other_type *)
  • @Alcott 是正确的,您的代码既安全又正确。您可以在任何类型和 void* 之间来回转换,而无需在 C 中进行强制转换(但在 C++ 中则不行)。
  • 这是一个非常伤脑筋的决定,因为void * 的全部意义在于它隐式转换。否则,它就是 char * 的无用副本。
  • @Alcott 他的意思是这样设计 C++ 是一个愚蠢的决定,因为没有隐式转换,它的工作原理与char* 完全一样,而且毫无意义。
  • 在 C 中使用 void * 的唯一原因是它具有方便的隐式转换属性,可让您避免在代码中乱扔转换,这反过来又可以隐藏令人讨厌的错误。 (在野外,我估计 50-80% 的演员表是“警告修复”,它掩盖了一个真正的错误,而不是修复任何东西。)除了那个属性和你不允许对其进行算术运算的事实之外, void *char * 相同。它们甚至可以保证具有相同的表示形式,并且所有指针都可以保证在往返于char * 和返回的过程中存活。
【解决方案2】:

您的代码将起作用。您可以将 void * 传递给期望结构 A * 的东西。 C 在这方面只是弱类型化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2014-05-30
    • 2021-07-22
    • 1970-01-01
    • 2020-09-08
    • 2010-09-29
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多