You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指向结构体的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:50:12