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;
如果违反以下任何假设,代码将导致未定义的行为:
BYTE
是 char
或 unsigned char
- none 你的数组访问越界
- 您的实现允许未对齐的访问,或者
int
和 float
所需的对齐不超过 4 个字节并且您的数组从适当对齐的地址开始
- 在您的平台上
int
和 float
没有无效的位模式,或者这些模式没有出现在您的数组中
虽然你不应该 return 一个分配的原始指针。使用 unique_ptr
.
您的代码的行为未定义。
即使 BYTE
是 unsigned char
类型(unsigned char
是严格别名规则的例外),也不能保证
*(int *)(data + 4);
等满足 int
.
的对齐要求
你最好的选择是 memcpy
将 BYTE
数组中的数据分配给每个结构成员,并相信编译器会优化(检查生成的程序集)。
您好,我认为这会导致未定义的行为,但不确定
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;
如果违反以下任何假设,代码将导致未定义的行为:
BYTE
是char
或unsigned char
- none 你的数组访问越界
- 您的实现允许未对齐的访问,或者
int
和float
所需的对齐不超过 4 个字节并且您的数组从适当对齐的地址开始 - 在您的平台上
int
和float
没有无效的位模式,或者这些模式没有出现在您的数组中
虽然你不应该 return 一个分配的原始指针。使用 unique_ptr
.
您的代码的行为未定义。
即使 BYTE
是 unsigned char
类型(unsigned char
是严格别名规则的例外),也不能保证
*(int *)(data + 4);
等满足 int
.
你最好的选择是 memcpy
将 BYTE
数组中的数据分配给每个结构成员,并相信编译器会优化(检查生成的程序集)。