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

C语言结构体指针访问成员报错:invalid type argument of '->' (have 'int')

问题原因及修复方案

核心报错原因

你遇到的编译错误本质是运算符优先级错误、括号位置错误、结构体成员访问符误用三者共同导致的:
C语言中->运算符的优先级远高于解引用运算符*,你写的错误表达式 &(*(GetParams())->DefaultActivationType) 实际执行顺序和你预期完全不同:

  1. 第一步执行GetParams(),拿到Params_t *类型的结构体指针,这一步是正常的
  2. 优先级更高的->先执行:GetParams()->DefaultActivationType,直接拿到了该字段的值,类型是ActivationType_t(本质是整数类型)
  3. 接下来执行*(上一步得到的整数值):对一个非指针的整数做解引用操作属于非法语法,编译器因此抛出invalid type argument of '->' (have 'int')的报错

你的思路误区在于:*(GetParams())确实是结构体实例,但访问实例的成员要用.运算符,而不是只能给结构体指针用的->运算符,同时你括号的位置错误,导致->先作用到了原始指针上,拿到整数字段后触发非法操作。

正确写法

首先确认你的回调定义:void (*OnJoin)(ActivationType_t Mode) 要求传入的是ActivationType_t类型的值,而非指针,所以调用代码直接写即可:

JoinCB(GetParams()->DefaultActivationType);

如果你确实需要传入该字段的地址(比如需要在回调内部修改这个参数的取值,需要先把回调参数类型改为ActivationType_t *Mode),两种正确写法二选一:

  • 直接用结构体指针访问后取地址:
JoinCB(&(GetParams()->DefaultActivationType));
  • 先解引用得到结构体实例,用.访问成员后取地址:
JoinCB(&((*GetParams()).DefaultActivationType));

额外需要排查的兼容性问题

你主文件中存储回调的变量类型是OnJoinRequest,但注册函数的入参是OnJoin类型,需要确认二者是完全一致的函数指针类型,否则即使编译通过,调用回调时也会出现未定义行为。
另外你贴的配置文件代码中,static Params_t Params = { ... } 定义末尾缺少分号,属于语法错误,需要补充。


内容的提问来源于stack exchange,提问作者Clément

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:15:03