3

だから私はを使用しようとしてether_aton()いますstruct ether_addr *。これを、メンバーを持つ (net/ethernet.h から)
に入れようとしています。私はこれを試しました:struct ether_header *eptrether_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 では代入演算子の左オペランドをキャストすることはできません」と書いています。

これは正しいですが、そうでないケースが 1 つあります: キャストしてからポインターを逆参照します。

 *((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 に答える