我有一些c++代码定义了一个结构:
struct IcmpHdr
{
uint8_t m_type;
uint8_t m_code;
uint16_t m_chksum;
uint16_t m_id;
uint16_t m_seq;
} __attribute__((packed, aligned(2)))
我知道这个结构在分配时总是在一个可以被2整除的地址上对齐,因为如果需要,会在结构前面添加一个填充字节。
这个结构在经过要在接收端解包的连线之前被强制转换为字节数组。现在,如果我将字节存储在数组char byte_array[8];
中,接收端会发生什么
然后最终将其作为指向我的类型的指针?
IcmpHdr* header = (IcmpHdr*)byte_array;
结构发生错位的几率是50/50吗?这会在取消引用成员时导致未定义的行为吗?其他问题?
我知道我可以在2字节的边界上对齐数组,这样就不用考虑这个问题了。好奇心是我提出这个问题的主要原因。
- 避免指针双关,因为它几乎总是违反严格的别名规则
- 结构的对齐并不重要,因为字节数组不必对齐2个字节
使用memcpy
IcmpHdr header;
memcpy(&header, byte_array, sizeof(header));
如果使用现代优化编译器,则不太可能调用memcpy
。
https://godbolt.org/z/6P5M333dv