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

问题描述

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

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;

解决方法

您的代码行为未定义。

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

*(int *)(data + 4);

等符合 int 的对齐要求。

最好的办法是将 memcpy 数组中的数据 BYTE 到每个结构体成员,并信任编译器进行优化(检查生成的程序集)。

,

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

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

不过,您不应该返回已分配的原始指针。使用 unique_ptr