簡體   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