【问题标题】:gcc: error: request for member ‘rlen’ in something not a structure or uniongcc:错误:在不是结构或联合的东西中请求成员“rlen”
【发布时间】:2011-10-02 23:02:51
【问题描述】:

我有一个包含结构的无符号字符指针。现在我想做以下事情

unsigned char *buffer ;

//code to fill the buffer with the relavent information.

int len = ntohs((record_t*)buffer->len);

其中 record_t 结构包含一个名为 len 的字段。我无法这样做并收到错误。

error: request for member ‘len’ in something not a structure or union.

我在这里做错了什么?

【问题讨论】:

标签: c pointers gcc gcc-warning


【解决方案1】:

C 中,您不能只取buffer->len,因为它被解析为好像最终结果buffer->len 被转换为record_t *。试试

((record_t *)buffer)->len

【讨论】:

  • 我想补充一点,原因是-> 的优先级高于强制转换,OP 应该学习 C 运算符优先级表,或者使用更多的括号。
【解决方案2】:

如果您确信自己在做正确的事情(尽管这看起来很骇人听闻),您只需要正确设置运算符优先级:

ntohs( ((record_t*)buffer)->len );

【讨论】:

  • 我已经尝试了以下语句。 ntohs(((record_t*)buffer)->len);括号在正确的位置。但这会给出错误错误:取消引用类型双关指针将破坏严格的别名规则。我可能需要提到缓冲区是 uint8_t buffer[24];
  • 我只尝试过 len。那是一个错字 :)
  • 这不是错误,而是警告。正如我所说,您正在做一些非常骇人听闻的事情,并且更好地了解情况。如果您不想发布您的实际问题,我只能帮助操作员优先级。
  • 通过声明 record_t rec; 解决了这个问题rec = (record_t) 缓冲区;然后做rec->rlen。我不知道为什么它不能直接工作。
  • 如果您好奇,请将其作为一个单独的问题发布。
【解决方案3】:

试试((record_t*)buffer)->len

您将buffer->len 转换为record_t*,,而您想要将buffer 转换为record_t,然后获取len 的值。

【讨论】:

    【解决方案4】:

    -> 的优先级高于强制转换。适当添加一些括号。

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多