实现TCP/IP栈时,将void*缓冲区指针转不同结构体指针是否合规?
C++中以太网帧解析的指针转换合规性问题
我正在学习并尝试用C++实现TCP/IP栈,在解析以太网帧提取头部信息时,采用std::memcpy()处理,代码如下:
std::memcpy(&Des, static_cast<uint8_t*>(Rx_Frame.payload)+ETH::preample_SFD_Size, ETH::Phy_Addr_Size);
但查看lwip源码时发现,它直接将以太网帧指针转换为struct eth_hdr类型指针并解引用,代码如下:
/* points to packet payload, which starts with an Ethernet header */ ethhdr = (struct eth_hdr *)p->payload;
我曾了解此类操作属于未定义行为,想请教以下问题:
- 由于原指针是不可解引用的
void*,这种情况是否合规? - 是否不构成类型双关?
- 若构成类型双关,是否不允许将其转换为结构体指针?
内容的提问来源于stack exchange,提问作者maboeln1
相关产品推荐
相关产品推荐

