2011-07-28 22 views
2

私はCで遊んでいるので、私は常に新しい問題を抱えています。今、私は、char bufのに自分のデータをmemcopyやりたいが、私はいくつかの問題に遭遇しています:私のコードは以下の通りです:memcpy()の使用

  int main(int argc, char *argv[]) 
     { 
     int sockfd, portno, n; 
     struct sockaddr_in serv_addr; 
     struct hostent *server; 
    unsigned char buf[1024]; 

     struct profile_t 
     { 
     unsigned char length; 
     unsigned char type; 
     unsigned char *data; 
     }; 

     typedef struct profile_datagram_t 
     { 
     unsigned char src[4]; 
     unsigned char dst[4]; 
     unsigned char ver; 
     unsigned char n; 
     struct profile_t profiles[MAXPROFILES];  
     } header; 


     header outObj; 

     outObj.src[0] =1; 
    outObj.dst[0] = 2; 
    outObj.ver = 1; 
    outObj.n = 2; 


    outObj.profiles[0].length = 10; 
    outObj.profiles[0].type = 1; 
    outObj.profiles[1].length = 10; 
    outObj.profiles[1].type = 2; 




    memcpy(buf,outObj.src,4); 
    memcpy(buf+4,outObj.dst,4); 
    memcpy(buf+8,outObj.ver,1); 
    memcpy(buf+9,outObj.n,2); 


    memcpy(buf+10,outObj.profiles[0].length,1); 
    memcpy(buf+11,outObj.profiles[0].type,1); 
    memcpy(buf=12,outObj.profiles[0].data,10); 

私は次のエラーを取得しています:

warning: passing argument 2 of memcpy makes pointer from integer without a cast
error: incompatible types when assigning to type unsigned char[1024] from type int

誤りがありますmemcpy()の場合誰でも私について説明することができますmemcpy()と私は間違っているつもりです。

+2

無関係:最後の行の 'buf = 12'はコンパイルされますが、間違ったことをします... – sth

+1

@sth:本当に?私はそれが彼の両立しないタイプのエラーがどこから来ているのだと思います。今、 'buf'がポインタだった場合... – user7116

+0

@sixlettervariables' buf = 12'が 'memcpy'の目的地として使われます。つまり、 '12'のアドレスに書き込もうとします。 – David

答えて

6

構造のさまざまなフィールドのアドレスを渡す必要があります。名前で配列を渡すと、自動的に配列の先頭のアドレスになります。

memcpy(buf+10,&outObj.profiles[0].length,sizeof(outObj.profiles[0].length)); 
+1

すばらしい説明、ありがとう!もし私が2倍の投票をすることができたら、私はそうします。 – tozhan

1

二つの主要な問題ことがあります。さておき、これはあなたがlengthの種類を変更する場合には優れているとおり

memcpy(buf+10,&outObj.profiles[0].length,1); 

:しかし、非配列フィールドは、アドレス演算子&を必要としますあなたがverまたは様構造における非ポインタ項目のアドレスを使用する必要があります

  • :私は上に触れますあなたがのメモリレイアウトやエンディアンについて確信している場合は、単にヒントとして

    memcpy(buf=12,... /* should be buf+12 */ 
    
0

::

/* note the & before outObj.ver */ 
memcpy(buf+8, &outObj.ver, 1); 
  • 誤って最後の行にbufに値を代入しますbufと構造体(そのパディングとアラインメントを含む)は、単に以下のようなキャストを行うことができます:

    header * outObj = (header *)buf; 
    

    自動的にメンバーにアクセスします。 header->verheader->srcなど