我声明了一个名为“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;
}
我得到“转换为请求的非标量类型”。
答案 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;
}