类型转换错误:需要左值作为赋值的左操作数

3

我正在尝试使用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);

这给我带来了“错误:需要左值作为赋值操作数”的提示。 我知道我只是没有正确地进行类型转换,但是不知道如何解决。
编辑: 最终解决了。谢谢大家的帮助。
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] 是没有意义的。 - Fred Foo
3个回答

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

5

一位作者写道:“在C语言中,你不能转换赋值运算符的左操作数”。

这是正确的,但有一种情况例外:先进行类型转换,再解引用指针:

 *((int *) chrPtrValue) = some_integer_expression;

在这种情况下,我们告诉编译器将chrPtrValue视为整数指针表达式,然后我们要求编译器对其进行解引用,以便我们可以在那里存储一些东西。
请注意,您可以通过这种方式执行一些奇怪/危险的指针操作,例如:
  *((int *) 0xFEDBCA01) = 0;

通过提供一个字面常量值,可以将零存储在任意位置!这听起来很疯狂,但如果你需要查看和操作内存映射的 I/O 寄存器,这种方法是非常有用的。


0
更具体地说,您正在“转换”ether_shost(一个结构)。我认为您想转换“eptr”。
这应该编译(但是它是无意义和愚蠢的):
(struct ether_addr*)(eptr)->ether_shost = ether_aton(SRC_ETHER_ADDR);

@larsmans 不确定您是否在查看编辑后的答案。 - Eitan T
@EitanT:你是指你的编辑吗?不,我拒绝了那个。我也没有看到答案下面有“已编辑”的消息。 - Fred Foo
这是我看到的代码行:(eptr)->ether_shost = (struct ether_addr*)ether_aton(SRC_ETHER_ADDR);,看起来像是我编辑过的。 - Eitan T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接