【问题标题】:Casting Error: lvalue required as left operand of assignment转换错误:需要左值作为赋值的左操作数
【发布时间】:2012-06-15 20:25:36
【问题描述】:

所以我尝试使用ether_aton(),它返回struct ether_addr *
我试图把它放在我的struct ether_header *eptr(来自net/ethernet.h)中,它有ether_shost 成员。我试过这个:

 struct ether_header *eptr;  /* net/ethernet.h */
 ... 
 (struct ether_addr*)(eptr->ether_shost) = ether_aton(SRC_ETHER_ADDR);

这给了我"Error: lvalue required as left operand of assignment"

我知道我只是没有正确地投射它,但不知道如何。


编辑: 最终得到它。谢谢大家的帮助。

struct ether_addr* eth_addr = ether_aton(SRC_ETHER_ADDR);
int i;  
for(i=0; i<6; i++)
    eptr->ether_shost[i] = eth_addr->ether_addr_octet[i];

只需要单独分配每个八位字节。

【问题讨论】:

  • 您可能的意思是 eptr = ether_aton(SRC_ETHER_ADDR);ether_header * 分配给 u_int8_t ether_shost[ETH_ALEN] 没有意义。

标签: c pointers casting lvalue


【解决方案1】:

您不能在 C 中强制转换赋值运算符的左操作数。

【讨论】:

    【解决方案2】:

    一位发帖人写道“你不能在 C 中强制转换赋值运算符的左操作数”

    这是真的,有点,但有一种情况是不正确的:强制转换,然后取消引用指针:

     *((int *) chrPtrValue) = some_integer_expression;
    

    在这种情况下,我们告诉编译器将 chrPtrValue 视为整数指针表达式,然后我们要求编译器取消引用它以便我们可以在那里存储一些东西。

    请注意,您可以通过这种方式进行一些时髦/危险的指针操作,例如:

      *((int *) 0xFEDBCA01) = 0;
    

    只需提供一个字面常量值,即可将零存储在任意位置!很疯狂,但如果您正在偷看和探查内存映射的 I/O 寄存器,则很有用。

    【讨论】:

      【解决方案3】:

      更具体地说,您正在“铸造” ether_shost(一个结构)。我认为您的意思是投射“eptr”。

      这应该编译(但它没有意义和愚蠢):

      (struct ether_addr*)(eptr)->ether_shost = ether_aton(SRC_ETHER_ADDR);
      

      【讨论】:

      • @larsmans 不确定您是否正在查看已编辑的答案。
      • @EitanT:你的意思是你的编辑?不,我拒绝了。我也没有在答案下方看到“已编辑”消息。
      • 这是我看到的行:(eptr)-&gt;ether_shost = (struct ether_addr*)ether_aton(SRC_ETHER_ADDR);,看起来像我的编辑。
      猜你喜欢
      • 2011-12-20
      • 2011-03-04
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      相关资源
      最近更新 更多