3

所以我尝试使用ether_aton()which 返回一个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];

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

4

3 回答 3

6

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

于 2012-06-15T20:26:16.740 回答
4

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

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

 *((int *) chrPtrValue) = some_integer_expression;

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

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

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

只需提供文字常量值,即可在任意位置存储零!例如,如果您正在查看和戳内存映射的 I/O 寄存器,这很疯狂,但很有用。

于 2013-10-01T00:31:29.907 回答
0

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

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

(struct ether_addr*)(eptr)->ether_shost = ether_aton(SRC_ETHER_ADDR);
于 2012-06-15T20:30:12.950 回答