C语言结构体指针访问成员报错:invalid type argument of '->' (have 'int')
问题原因及修复方案
核心报错原因
你遇到的编译错误本质是运算符优先级错误、括号位置错误、结构体成员访问符误用三者共同导致的:
C语言中->运算符的优先级远高于解引用运算符*,你写的错误表达式 &(*(GetParams())->DefaultActivationType) 实际执行顺序和你预期完全不同:
- 第一步执行
GetParams(),拿到Params_t *类型的结构体指针,这一步是正常的 - 优先级更高的
->先执行:GetParams()->DefaultActivationType,直接拿到了该字段的值,类型是ActivationType_t(本质是整数类型) - 接下来执行
*(上一步得到的整数值):对一个非指针的整数做解引用操作属于非法语法,编译器因此抛出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
相关产品推荐
相关产品推荐

