从void *转换为struct

时间:2013-03-16 19:18:38

标签: c struct void-pointers

我将struct Person类型的数据传递给链表,因此每个节点的数据指针指向一个结构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;
};

我的print函数接受void * data:

print(void *data) { .... }

我知道我必须将数据转换为struct Person,对吗?

struct Person *person = (struct Person *)data;
printf("%s", person->name);

我知道这还不够,因为我收到了“从不兼容的指针类型初始化”警告。在这种情况下,如何成功投出空白*?谢谢。

3 个答案:

答案 0 :(得分:3)

问题不在于演员表,甚至与你传递函数的方式有关。问题是您的print声明缺少返回类型,在这种情况下通常会假定int。编译器抱怨,因为您将int (*)(void*)传递给期望void (*)(void*)的函数。

很容易修复:只需在void函数声明前添加print即可。参见:

https://gist.github.com/ods94065/5178095

答案 1 :(得分:1)

  

我的打印功能接受void * data

我会说,接受print重写您的struct Person *功能。

答案 2 :(得分:0)

您的traverseList函数接受一个函数指针(它接受一个void指针),但它不接受该void数据的参数。看来这就是你所追求的:

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);