从 void* 转换为 struct

标签 c struct void-pointers

我正在将 struct Person 类型的数据传递给链表,因此每个节点的数据指针都指向一个 struct Person。

struct Person {
char name[16];
char text[24];
};

我正在尝试遍历列表并通过调用打印每个节点中的名称/文本

traverse(&list, &print);

遍历的原型(prototype)是:

void traverseList(struct List *list, void (*f)(void *));   

列表定义为:

struct List {
struct Node *head;
};

我的打印函数接受一个 void * 数据:

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

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

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

我知道这还不够,因为我收到了“从不兼容的指针类型进行初始化”警告。在这种情况下,我怎样才能成功转换 void* ?谢谢。

最佳答案

问题不在于转换,甚至不在于您传递函数的方式。问题是您的 print 声明缺少返回类型,在这种情况下通常假定为 int。编译器报错是因为您将 int (*)(void*) 传递给需要 void (*)(void*) 的函数。

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

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

关于从 void* 转换为 struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453593/

相关文章:

c - 在内存中分配的修改后的结构在函数结束后不保留值

你可以 bool 值小于比较 C 中的 2 个 void * 值吗?

c - "Double dot"C 中的目录名?

c - 我的数组的第一个元素来自哪里,它是什么?

无法为结构成员赋值

c - 使用 void 指针会导致编译器警告错误

c++ - 使用 Void* 指针的链表

c - 终端如何从标准输出读取并在屏幕上绘制文本?

c - 在不安装的情况下构建嵌套的 Autotools 包

c++ - 从另一个进程获取加载的模块