所以我有一个这样设置的结构
编辑: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/