【问题标题】:error: invalid type argument of '->' - Printing the address of a struct field that is also a struct [closed]错误:'->'的无效类型参数-打印也是结构的结构字段的地址[关闭]
【发布时间】:2019-01-26 21:43:53
【问题描述】:

我有一个这样的结构:

struct my_struct {
    struct_a a;
    struct_b b;
};

我正在尝试打印my_struct 类型的变量的地址以及它的字段地址ab,它们也是结构:

void some_function(my_struct *my) {     
     //....
     printf("my addr: %p - a addr: %p - b addr: %p", my, (void *) &my->a,   
                (void *) &my->b);
}

int main() {        
     my_struct my; //my is initialized in a function...
     //then, it is passed to some_function(...) bellow...
     printf("my addr: %p - a addr: %p - b addr: %p", my, (void *) &my->a,   
                (void *) &my->b);
     some_function(&my);
     return 0;
}

我收到以下错误:

错误:'->' 的类型参数无效(有 'struct my_struct')

我的理解有什么问题?

【问题讨论】:

  • my 不是指针,因此您可以使用. 而不是-> 访问它的元素。
  • @ChristianGibbons my 是一个指针...
  • 哦,等等。有两个mys。
  • @DaltonCézane 你能提供一个minimal reproducible example吗?我稍微调整了代码以便能够编译它,但我无法重现:coliru.stacked-crooked.com/a/be082558cb10e356
  • 并且还立即提供 MCVE。 :)

标签: c struct printf


【解决方案1】:

问题实际上出在您的main 函数中,其中mystruct my_struct 的一个实例,因此在其上使用-> 运算符是无效的。将printf 调用改为使用.

int main() {        
     my_struct my; //my is initialized in a function...
     //then, it is passed to some_function(...) bellow...
     printf("my addr: %p - a addr: %p - b addr: %p", (void *)&my, (void *) &my.a,   
                (void *) &my.b);
     some_function(&my);
     return 0;
}

还要注意main 必须返回int

【讨论】:

  • 感谢您的回答。我的代码中有一个错误:some_function() 中不存在该局部变量。我编辑了我的问题,解决了这个问题。但是我的代码和你的一样,除了 (void *) my 之外,在 &my->a&my->b 部分仍然有错误...
  • @DaltonCézane 我拥有的函数可以编译。你确定你没有在函数的其他地方定义my吗?
  • 你是对的。我会将您的答案标记为“答案”。当my不被用作指针时,你能插入一段代码吗?在这种情况下,我们必须使用&my.a&my.b...这是我的问题...我正在调试代码并将printf 放在接收my_struct *my 的函数中,我也使用它main 函数内部的 printf 相同,其中声明了 my... 所以,我不得不在主函数中将 -> 更改为 .
  • 这不回答问题的当前版本。通常,必须回滚问题,因为最新的编辑使答案没有上下文。但问题是没有编辑问题缺少minimal reproducible example 并且这个答案也没有回答以前的版本,但是一些非常旧的版本由于使用不同类型的重新声明甚至不应该编译。所以我留下问题并要求您编辑答案以匹配当前版本。 @DaltonCézane 如果编辑留下没有上下文的答案,请不要编辑您的问题!这违反了网站规则。
  • @too ,我已经编辑了放置缺失部分的问题:main 函数。因此,现在很清楚问题出在哪里,并且作为答案中的编辑,也很清楚解决方案是什么。我不好的问题的第一个描述。我打字很快,没有注意 MCVE。正如我所说,我很抱歉......但我解决了这个问题,添加了缺少的部分,我相信现在它确实有意义。
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2020-09-23
相关资源
最近更新 更多