在C中传递Void类型参数

Ada*_*Lee 8 c void-pointers

你好,我正在C中进行一项任务,我需要将一个未知类型的参数传递给一个函数.

例如,假设我有以下内容:

int changeCount(void* element)
{
    element.Count = element.Count++;

    return 1;

}
Run Code Online (Sandbox Code Playgroud)

变量元素无效的原因是因为有三种可能性.但是,所有3都有一个名为"Count"的成员变量.

当我尝试编译我在Eclipese中编写的实际代码时,出现以下错误:

错误:请求成员'计数'不是结构或联合

我猜这种情况正在发生,因为编译器事先并不知道"元素"的类型.但是,我不明白为什么这不起作用.

感谢帮助!

Nav*_*een 12

您需要将指针强制转换为这3种类型中的一种,然后使用它.就像是:

MyType* p = (MyType*)element;
p->count++;
Run Code Online (Sandbox Code Playgroud)

但是,您需要确定要投射的对象的类型,因为将对象强制转换为错误的类型可能会很危险.

  • 你必须知道......没有出路 (2认同)
  • 有一条出路:了解Count的偏移量.如果offset为0,则可以执行`*((int*)element)++;`等等. (2认同)

CB *_*ley 9

首先,您传入一个指向void的指针,这是未知类型的有效方法,但您需要将指针传递给不同的对象类型.

C不是动态语言,因此符号类型信息在运行时间之前被大量删除,所以当你说你的三种类型都有一个成员时,Count这对你的功能设计没有帮助.

您可以访问的唯一方法Countvoid*在使用->(*element).Count(即不仅仅.)进行derefencing之前将参数转换为正确的指针类型.

除非您依赖于具有兼容布局的类型(可能依赖于实现),否则您还需要传递一些有助于您的函数确定要执行的正确转换的内容.在这一点上,你可能会有三个单独的功能和更好的类型安全性.


rer*_*run 6

您必须将其强制转换为实际类型,但您可能会在结构中获得意外结果,并且在同一位置没有count属性.

typedef struct _A 
{
    int count;
    int x;
}A;
int changeCount(void* element)
{
    ((A*)element)->Count++;

    return 1;

}
Run Code Online (Sandbox Code Playgroud)

还要记住,如果将指针传递给如下所示的结构,则会增加x字段而不是计数.

typedef struct _B 
{
    int x;      
    int count;

}B;

    B st;
    B* pst = &st;
    changeCount(pst);
Run Code Online (Sandbox Code Playgroud)