从void*到struct的转换

从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类型的数据传递给一个链表,因此每个节点的数据指针都指向一个struct Person

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*)
。我怀疑它的便携性不太安全,在我看来也不太优雅。