将结构传递给C中的泛型函数

时间:2011-04-17 20:41:52

标签: c

我声明了一个名为“Struct”的新结构 我有一个泛型函数,它接受一个参数“void * data”。

void Foo(void *data)

我将“Struct”的实例传递给泛型函数。

Struct s;
Foo(&s);

我想访问函数中struct的一个属性。

void Foo(void *data) {
    char *word = (char*) data.word;
}

不允许这样做,因为它无法将数据识别为有效的结构。

我甚至首先尝试将数据声明为结构类型,然后出现错误。

void Foo(void *data) {
    Struct s = (Struct) data;
    char *word = s.word;
}

我得到“转换为请求的非标量类型”。

7 个答案:

答案 0 :(得分:3)

首先,您应该打开编译器的警告标志(所有这些标志)。然后,您应该将指针传递给Struct并使用struct以外的其他内容作为变量名称:

Struct s;
Foo(&s);

然后,在Foo

void Foo(void *data) {
    Struct *s    = data;
    char   *word = s->word;
}

你不能像你想要的那样将非指针类型转换为void*和从void*转换指针类型,另一方面,转换指针类型是有效的。

答案 1 :(得分:2)

您需要将指针传递给您的struct并获取指向函数内部结构的指针:

Struct struct;
Foo(&struct);

void Foo(void *data) {
    Struct* struct = (Struct*) data;
    char *word = struct->word;
}

答案 2 :(得分:1)

通过指针请求结构成员时,必须使用->运算符。

这应该有效:char *word = (char*) data->word;

您还必须将结构的地址传递给函数。像这样:Foo(&struct);

答案 3 :(得分:1)

首先,您需要正确调用该函数:

Struct s;
Foo(&s);

请注意,您现在正在传递指向结构的指针。

现在,该函数必须知道您正在使用Struct(而不是其他东西) - 可能是因为另一个参数,或全局变量,或其他一些原因。然后在函数内部执行:

void Foo(void *data) {
    Struct *structpointer = p; /* Note - no need for a cast here */


    /* (determine whether data does refer to a pointer then...) */
    char *word = structpointer->word;
    /* ... then use 'word'... */
}

答案 4 :(得分:0)

数据是指针,所以无论你把它投射到什么地方也必须是一个指针。如果你说Struct* myStruct = (Struct*) data,那么全世界都会很好。

答案 5 :(得分:0)

您正在混合指针和数据。

Struct struct定义了一个数据对象
void *data期望data成为指针。

使用指向Foo的指针调用Struct,并进行其他必要的更改

答案 6 :(得分:0)

Struct struct;
Foo((void*)&struct);

void Foo(void *data) {
    Struct *struct = (Struct*)data;
    char *word = struct->word;
}

或更紧凑的形式:

Struct struct;
Foo((void*)&struct);

void Foo(void *data) {
    char *word = ((Struct*)data)->word;        
}