如何在指向结构体的void*中调用结构体内部的函数指针
解决方法
你的代码报错的核心原因是:t->stack是void*类型的无类型指针,C语言编译器无法识别它指向的具体结构体结构,因此不能直接通过->运算符访问fp成员。
要实现正确调用,必须先将void*强制转换为struct func*类型,再访问内部的函数指针:
// 先做类型转换,再调用函数指针 ((struct func*)t->stack)->fp();
完整修正后的代码如下:
struct func { void (*fp)(); // 函数指针 }; struct thread{ void *stack; // 存储struct func指针 }; void assign(struct thread *t, void (*f)()){ struct func *task = (struct func *)malloc(sizeof(struct func)); task->fp = f; t->stack = task; // 正确调用方式 ((struct func*)t->stack)->fp(); }
额外注意事项:
- 你原代码中
assign的参数void *f()会被C语言解析为void* (*f)(),和struct func里的void (*fp)()类型不匹配,赋值时会触发类型警告。建议将参数改为void (*f)(),保证函数指针类型完全一致,避免潜在的未定义行为。 - 必须确保
t->stack始终指向合法的struct func实例,否则强制转换后调用函数指针会导致程序崩溃或异常。
内容的提问来源于stack exchange,提问作者Chunhao
相关产品推荐
相关产品推荐

