7

我将 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*?谢谢你。

4

3 回答 3

3

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

这很容易解决:只需在函数声明void前添加即可。print看:

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

于 2013-03-16T19:46:41.080 回答
1

我的打印功能接受 void * 数据

我会说,print通过接受来重写你的函数struct Person *

于 2013-03-16T19:22:01.853 回答
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);
于 2013-03-16T19:42:32.200 回答