问题描述
您好,我认为这是导致未定义行为但不确定
PlayerMoving *unpackPlayerMoving(BYTE *data)
{
PlayerMoving *dataStruct = new PlayerMoving;
dataStruct->packetType = *(int *)(data);
dataStruct->netID = *(int *)(data + 4);
dataStruct->characterState = *(int *)(data + 12);
dataStruct->plantingTree = *(int *)(data + 20);
dataStruct->x = *(float *)(data + 24);
dataStruct->y = *(float *)(data + 28);
dataStruct->XSpeed = *(float *)(data + 32);
dataStruct->YSpeed = *(float *)(data + 36);
dataStruct->punchX = *(int *)(data + 44);
dataStruct->punchY = *(int *)(data + 48);
return dataStruct;
}
它是否会导致它,如果它导致我如何修复它?
这是播放器
struct PlayerMoving
{
int packetType;
int netID;
float x;
float y;
int characterState;
int plantingTree;
float XSpeed;
float YSpeed;
int punchX;
int punchY;
int secondnetID;
};
和字节是
typedef unsigned char BYTE;
解决方法
您的代码行为未定义。
即使 BYTE
是 unsigned char
类型(unsigned char
是严格别名规则的例外),也不能保证
*(int *)(data + 4);
等符合 int
的对齐要求。
最好的办法是将 memcpy
数组中的数据 BYTE
到每个结构体成员,并信任编译器进行优化(检查生成的程序集)。
如果违反以下任何假设,代码将导致未定义的行为:
-
BYTE
是char
或unsigned char
- 您的数组访问都没有越界
- 您的实现允许未对齐的访问,或者
int
和float
所需的对齐不超过 4 个字节,并且您的数组从适当对齐的地址开始 - 在您的平台上,没有对
int
和float
无效的位模式,或者这些模式没有出现在您的数组中
不过,您不应该返回已分配的原始指针。使用 unique_ptr
。