从偏移量开始复制到结构的开头

Copying starting at offset to beginning of structure

本文关键字:结构 开头 复制 偏移量 开始      更新时间:2023-10-16

所以我有一个这样的结构

编辑:玩家坐标= 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 个字节)

我正在尝试弄清楚如何将其正确内存到具有偏移量的来源。我发现我需要离结构地址 4 个字节才能从 int x 开始。但是,我发现当我尝试通过执行(&testdata+4)将4添加到地址时,它反而在地址中添加了40!任何人都知道我如何对结构进行 4 个字节的偏移,或者我一次只能将地址偏移 4 个字节而不是 10 个字节?

非常感谢您的阅读。

你想要的是以下内容:

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

原因是因为应用于指针的 + 运算符将指定的整数乘以所指向事物的大小。这就是为什么在地址中添加 4 会增加 40 的原因。在添加 4 之前转换为字符*将添加 4 个字节的位置。另外,如果你想要一些更便携的东西,以下将是一个很好的技巧来做你想做的事情:

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

这样做的好处是向地址添加一个整数大小单位,而不管int的大小如何。

正如 Lalaland 所指出的,最好像这样使用偏移量:

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