2014-01-16 32 views
0

所以我已经设置了像这样复制起始偏移结构的开始

编辑的结构:PLAYERCOORDS = 1,它是在我的代码开头定义

struct PLAYERCOORDINATESSTRUCT 
{ 
    int type, x, y; 
    bool isalive; 
    bool isconnected; 
    PLAYERCOORDINATESSTRUCT(int customx, int customy, bool customisalive, bool customisconnected) 
    { 
     type=(PLAYERCOORDS); 
     x = customx; 
     y = customy; 
     isalive = customisalive; 
     isconnected = customisconnected; 
    } 
    PLAYERCOORDINATESSTRUCT() 
    { 
     type=(PLAYERCOORDS); 
    } 
}; 

char* bufferwithstructdata = new char[sizeof(PLAYERCOORDINATESSTRUCT)-4]; 
//-4 since it's missing first int 
PLAYERCOORDINATESSTRUCT testdata; 
memcpy(&testdata,bufferwithstructdata,sizeof(PLAYERCOORDINATESSTRUCT)-4) 

我有一个char缓冲区,其中包含所有这些结构的信息,除了int类型(结构的前4个字节)

我想弄清楚如何正确地memcpy这与一个偏移源。 我发现我需要从结构地址开始的4个字节以int x开头。 但是,我发现当我试图在地址上添加4(& testdata + 4)时,它将40添加到地址!任何人都可以知道如何将memcpy与结构的4字节偏移量相关联,或者我可以将地址偏移4个字节而不是每次10个。

非常感谢您的阅读。

回答

3

你想要的是以下几点:

memcpy(((char*)&testdata)+4, bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 

的原因是因为+运营商应用于指针将整型指定的时间所指向的大小事。这就是为什么添加4添加40的地址。在添加4之前转换为char *会添加4个字节的位置。另外,如果你想要的东西更便携一点,以下将是一个不错的把戏做你想要什么:

memcpy(((int*)&testdata)+1, bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 

这有增加一个整数大小单位的地址,无论大小的好处int

由于Lalaland指出,这将是更好的使用offsetof像这样:

memcpy(offsetof(PLAYERCOORDINATESSTRUCT, x), bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 
+0

谢谢你这么多CrazyCasta!我很困难XD – user2980207

+0

[offsetof](http://en.cppreference.com/w/cpp/types/offsetof)可能会使这段代码更加便携(并且更易于阅读)。 – Lalaland