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

标签 c++ struct offset memcpy

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

编辑: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 个字节的方法?

非常感谢阅读。

最佳答案

你想要的是:

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

关于c++ - 从偏移量开始复制到结构的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21152302/

相关文章:

c - 在函数中传递结构体

c - 在 C 结构体中分配 char

c++ - 如何在 struct 数据结构中使用 map STL 并初始化 map 然后引用它?

excel - 使用 Offset、Vlookup 和 Concatenate 返回列表

c++ - linux 中 windows SYSTEM_INFO 结构的替代方案

c++ - 如何使用 Qt (C++) 检查程序是否按其名称运行

c++ - 从文件读取整数输入到动态数组中并打印它

c++ - 让进程 "warm up"有什么用吗?

PHP 警告 : Illegal string offset

ios - UIButton 背景图片偏移量