繁体   English   中英

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

[英]What will happen if I cast a byte array to an __attribute__((packed, aligned(2))) struct?

我有一些定义结构的 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. 您的结构的 Alignment 无关紧要,因为您的字节数组不必对齐 2 个字节。

使用memcpy

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM