【问题标题】:Copying starting at offset to beginning of structure从偏移量开始复制到结构的开头
【发布时间】:2014-01-16 02:25:48
【问题描述】:

所以我有一个像这样设置的结构

编辑: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 开始。 但是,我发现当我尝试通过 (&testdata+4) 向地址添加 4 时,它反而向地址添加了 40!任何人都知道我如何用 4 个字节的偏移量对结构进行 memcpy,或者我可以一次将地址偏移 4 个字节而不是 10 个字节?

非常感谢您的阅读。

【问题讨论】:

    标签: c++ struct offset memcpy


    【解决方案1】:

    你想要的是以下内容:

    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);
    

    【讨论】:

    • 非常感谢 CrazyCasta!我被难住了XD
    • offsetof 可能会使此代码更便携(并且更易于阅读)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多