C++ 这个函数会导致未定义的行为吗?

C++ does this function cause a undefined behavior?

您好,我认为这会导致未定义的行为,但不确定

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

是不是它引起的,如果是我该如何解决?

这是 playermoving

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;

如果违反以下任何假设,代码将导致未定义的行为:

  • BYTEcharunsigned char
  • none 你的数组访问越界
  • 您的实现允许未对齐的访问,或者 intfloat 所需的对齐不超过 4 个字节并且您的数组从适当对齐的地址开始
  • 在您的平台上 intfloat 没有无效的位模式,或者这些模式没有出现在您的数组中

虽然你不应该 return 一个分配的原始指针。使用 unique_ptr.

您的代码的行为未定义。

即使 BYTEunsigned char 类型(unsigned char 是严格别名规则的例外),也不能保证

*(int *)(data + 4);

等满足 int.

的对齐要求

你最好的选择是 memcpyBYTE 数组中的数据分配给每个结构成员,并相信编译器会优化(检查生成的程序集)。