从void*到struct的转换
我正在将struct Person类型的数据传递给一个链表,因此每个节点的数据指针都指向一个struct Person从void*到struct的转换,c,struct,void-pointers,C,Struct,Void Pointers,我正在将struct Person类型的数据传递给一个链表,因此每个节点的数据指针都指向一个struct Person struct Person { char name[16]; char text[24]; }; 我试图遍历列表,并通过调用 traverse(&list, &print); 导线测量的原型是: void traverseList(struct List *list, void (*f)(void *)); 清单定义为: struct List {
struct Person {
char name[16];
char text[24];
};
我试图遍历列表,并通过调用
traverse(&list, &print);
导线测量的原型是:
void traverseList(struct List *list, void (*f)(void *));
清单定义为:
struct List {
struct Node *head;
};
我的打印函数接受void*数据:
print(void *data) { .... }
我知道我必须将数据转换为struct Person,对吗
struct Person *person = (struct Person *)data;
printf("%s", person->name);
我知道这是不够的,因为我收到了“从不兼容的指针类型初始化”警告。在这种情况下,我如何成功地释放一个void*?多谢各位
我的打印函数接受void*数据
我想说,通过接受
struct Person*
重写print
函数,您的traverseList函数接受函数指针(它接受一个空指针),但它不接受该空数据的参数。看来这就是你想要的:
void print (void* data)
{
printf("%s", ((struct Person*)data)->name);
}
void traverseList (struct List *list, void(*f)(void*), void* data)
{
f(data);
}
然后可以调用traverseList:
traverseList (&list, &print, &person);
问题不在于演员阵容,甚至不在于你传递函数的方式。问题是
print
的声明缺少返回类型,在这种情况下通常假定int
。编译器正在抱怨,因为您正在将int(*)(void*)
传递给一个需要void(*)(void*)
的函数
很容易修复:只需在打印
函数声明前添加void
。见:
什么是
导线测量的原型?哪种类型是list
?您可能需要检查如何传递要遍历的列表,以及如何实际使用print。您显示的所有内容似乎都匹配。@ValeriAtamaniouk我已经编辑了我的问题以包括这些内容。@user1889966是您的打印
声明为原样,还是返回无效
?如果没有返回就声明它,它可能是int
@ValeriAtamaniouk,我很抱歉没有包含它,它被声明为静态无效。我认为traverse
提供给print
的参数是traverse
resp的结构列表*
参数的数据成员。列表中后面的节点。这有什么关系?在C中,void*
与任何指向结构的非常量指针兼容。只是因为那时不需要强制转换。您仍然需要强制转换-在传递要遍历的函数时,您需要从void(*)(struct Person*)
强制转换到void(*)(void*)
。我怀疑它的便携性不太安全,在我看来也不太优雅。