将char数组转换为struct指针

问题描述 投票:3回答:2

我试图了解以下来自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。

我很感激能帮助我理解这里发生的事情。

谢谢

c pointers struct casting
2个回答
1
投票

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

的种类。在这个演员阵容中发生的事情是我们开始“观察”从&out_packet_buffer[0](或者只是out_packet_buffer)开始的内存块作为struct ip6_hdr而不是char[]

任何后来使用的iphdr都使用相同的内存,但将其拆分为struct ip6_hdr成员而不是char

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.