如果我将字节数组强制转换为__attribute__((packed,aligned(2)))结构,会发生什么



我有一些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字节的边界上对齐数组,这样就不用考虑这个问题了。好奇心是我提出这个问题的主要原因。

  1. 避免指针双关,因为它几乎总是违反严格的别名规则
  2. 结构的对齐并不重要,因为字节数组不必对齐2个字节

使用memcpy

IcmpHdr header;
memcpy(&header, byte_array, sizeof(header));

如果使用现代优化编译器,则不太可能调用memcpy

https://godbolt.org/z/6P5M333dv

最新更新