2012-06-15 2 views
2

Итак, я пытаюсь использовать ether_aton(), который возвращает struct ether_addr *.
Я пытаюсь поместить это в мой struct ether_header *eptr (из сети/ethernet.h), который имеет член ether_shost. Я попытался это:Ошибка кастинга: требуется значение lvalue в качестве левого операнда присваивания

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"

Я знаю, я просто не бросая его правильно, но не могу понять, каким образом.


EDIT: в конечном итоге получить его. Спасибо за помощь, ребята!

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]; 

Просто нужно было назначить каждый из октетов отдельно.

+0

Возможно, вы имели в виду 'eptr = ether_aton (SRC_ETHER_ADDR);' как присвоение 'ether_header *' '' u_int8_t ether_shost [ETH_ALEN] 'не имеет смысла. –

ответ

5

Вы не можете бросить левый операнд оператора присваивания в С.

0

Более конкретно, вы «кастинг» ether_shost (на структуру). Я думаю, вы хотели бросить «eptr».

Это должно составить (но это бессмысленно и глупо):

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

Вы скопировали с вопроса, вам нужно указать правильную сторону ... –

+0

@EitanT: нет, это работает. –

+0

@larsmans Не уверен, что вы смотрите на отредактированный ответ или нет. –

2

Один плакат написал «Вы не можете бросить левый операнд оператора присваивания в C»

Это правда, своего рода, но есть один случай, когда это не так: литье, затем разыменования указателя:

*((int *) chrPtrValue) = some_integer_expression; 

в этом случае мы говорим компилятору рассматривать chrPtrValue быть целым числом ро inter выражение, то мы попросим компилятор разыменовать его, чтобы мы могли что-то там хранить.

Обратите внимание, что вы можете сделать некоторые операции фанк/опасный указатель так, например:

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

магазин нуль в произвольном месте, просто предоставляя буквальное значение константы! Сумасшедший, но полезный, если вы просматриваете и запихиваете регистры ввода-вывода с отображением памяти, например.

Смежные вопросы