2011-07-28 75 views
2

自从我和C玩了两天后,我一直遇到新问题。现在我想做的事情MEMCOPY我的数据到一个char buf中,但我遇到了一些问题:我的代码如下: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,1); 

顺便说一句,这是情况好你改变length类型:

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

很好的解释,谢谢!如果我能两次投票,我会。 – tozhan

1

主要有两个问题,我会触摸:

  • 你需要使用非指针项目的地址结构类似vern

    /* note the & before outObj.ver */ 
    memcpy(buf+8, &outObj.ver, 1); 
    
  • 你不小心在最后一行的值赋给buf

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

正如一个提示,如果你是肯定有关的内存布局和字节序你的buf,和结构(包括其填充和对齐),你可以简单地做一个类似:

header * outObj = (header *)buf; 

并自动访问成员。像header->ver,header->src