将char数组转换为struct指针

时间:2018-01-01 16:51:14

标签: c pointers struct casting

我正在尝试从this code

了解以下广播
char out_packet_buffer[4500] ;  
struct ip6_hdr *iphdr ;

iphdr = (struct ip6_hdr *) &out_packet_buffer[0]; 

我的理解是否正确结构iphdr的成员变量存储在char数组out_packet_buffer中?在代码的后面,从不使用out_packet_buffer。相反,iphdr被记忆到uint8_t内存位置(ether_frame)。但是iphdr不是uint8_t。

我很感激任何指导,让我了解这里发生的事情。

由于

2 个答案:

答案 0 :(得分:1)

  

我的理解是否正确,结构iphdr的成员变量存储在char数组out_packet_buffer中?

有点儿。在这个演员阵容中发生的事情是我们开始“查看”从&out_packet_buffer[0](或仅out_packet_buffer)开始的内存块作为struct ip6_hdr而不是char[]。< / p>

以后使用iphdr时使用相同的内存,但会将其拆分为struct ip6_hdr成员而不是char

正如@Christian Gibbons所说,我也认为这违反了strict aliasing即UB

答案 1 :(得分:1)

看起来代码正在准备通过网络传输的数据包。数据包将包含标头和有效负载。据推测,整个数据包存储在out_packet_buffer中。 ip6_header结构是这个的前几个字节,后面跟着数据有效负载。使用头部的结构使代码更具可读性,但在将其发送到套接字之前,可能会有“网络顺序的结构顺序”功能。

在任何情况下,数据包只是一个字节序列,因此将其转换为任何8位类型都是可行的