【问题标题】:casting a void-pointer to a struct- pointer (in a function call)将 void 指针转换为结构指针(在函数调用中)
【发布时间】:2014-01-13 10:54:11
【问题描述】:

我有一个头文件(我们称之为 gen.h),其中包含以下行:

typedef void* pNode;
SampleFunction(PNode node); /* just a function for example*/

现在,假设我有另一个源文件(part.c),它包含以下结构:

typdef struct _OBJ* POBJ;
typdef struct _OBJ
{
    double xi;
    double xf;
    double yi;
    double yf;
    int key;
} 

我想将指向结构 (PBOJ) 的指针作为参数发送给期望获得指向 void 类型 (pNode) 的指针的函数 (比如说 SampleFunction);那我该怎么做呢?

【问题讨论】:

  • 您是否尝试将指针传递给函数?还有pNode != PNode
  • void * 的转换在 C 中是隐式的;你不必做任何特别的事情。
  • 也就是说,在 typedef 后面隐藏指针通常被认为是不好的做法,因为它掩盖了这里发生的事情。
  • @self 我的意思是写 pNode,PNode 只是一个错字。我还没有尝试过(通过 pobj 而不进行强制转换),我还没有完成我的代码。所以你们说我可以简单地做:SampleFunction (pobj) (当 pobj 是指向结构的指针时),没有强制转换或任何东西?
  • @user2750466 是的。 C 标准保证任何指针都可以转换为空指针或从空指针转换。你可以通过 char ********* 并且不需要演员表。当然,我希望这个函数能够记录一些关于它期望什么以及它将做什么的信息。除此之外的任何行为都是未指定的行为,当然应该避免。

标签: c pointers struct void-pointers


【解决方案1】:

下面的代码只是一个简单的示例,所以我没有写init,delete等。

struct _OBJ
{
  double xi;
  double xf;
  double yi;
  double yf;
  int key;
}; 

typedef struct _OBJ* POBJ;

typedef void* pNode;

void SampleFunction(pNode node)
{
  //null check  
  if(node == NULL)
  {
    //error
  }

  //Do Something
  // ...

}; /* just a function for example*/

int main()
{
  POBJ obj = new _OBJ;
  SampleFunction((pNode)obj);
  delete obj;
}

【讨论】:

  • 我无法更改 SampleFunction,SampleFunction 不知道我们可能发送给它的类型是什么,所以我需要从调用函数进行转换。
  • @user2750466 我已经编辑了上面的代码。正如 rullof 所说,你已经 typedef void*pNode,所以 void*pNode 完全相同。即使你只写 asSampleFunction(obj) 不进行类型转换,也很好。
  • newdelete 在 C 中不存在。也无需在 C 中强制转换 obj
  • @CodeDreamer 你必须使用mallocfree 而不是newdelete,因为它们只是c++
【解决方案2】:

您只需将其转换为 PNode 就像任何其他类型一样,因为 void* 可以安全地指向任何其他类型。

由于 PBOJ 是指向 _OBJ 的指针,因此您无需使用 & 运算符即可直接转换它

POBJ Ptr;
SampleFunction((PNode)Ptr);
// or SampleFunction((void *)Ptr);

【讨论】:

  • 但是 pNode 本身是 void * !
  • @user2750466 那有什么问题可以用(void *)Ptr或者(PNode)Ptr没有区别。
  • @user2750466 您必须将指针 node 再次转换为 POBJ,因为您无法取消引用 void * 然后您可以通过 castedPtr->member 访问它们
  • 但我不允许在 SampleFunction 中处理这个
  • SampleFunction 可以用于其他类型的指针 (int, cahr) ,obj 的类型可以是任何类型...
猜你喜欢
  • 2023-03-26
  • 2012-11-21
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多