0
如以下代碼所示,(uint16_t*)
用於s
,但(uint32_t*)
用於w
。爲什麼?該功能用於交換數據包中的目的MAC地址和源MAC地址嗎?(uint16_t *)和(uint32_t *)之間的區別是什麼?
static inline void
swap_mac_addr(uint64_t pkt_ptr)
{
uint16_t s;
uint32_t w;
/* assuming an IP/IPV6 pkt i.e. L2 header is 2 byte aligned, 4 byte non-aligned */
s = *(uint16_t*)pkt_ptr;
w = *(uint32_t*)(pkt_ptr+2);
*(uint16_t*)pkt_ptr = *(uint16_t*)(pkt_ptr+6);
*(uint32_t*)(pkt_ptr+2) = *(uint32_t*)(pkt_ptr+8);
*(uint16_t*)(pkt_ptr+6) = s;
*(uint32_t*)(pkt_ptr+8) = w;
}
此代碼違反嚴格別名規則,因此應被視爲展示未定義的行爲。 –
@EugeneSh .:即使考慮到評論(「*假設... *」)中寫的是什麼, – alk
@alk不是嗎?訪問指針爲16/32位整數的64位整數。這些指向不兼容的類型AFAIK .. –