Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将字符数组强制转换为结构指针_C_Pointers_Struct_Casting - Fatal编程技术网

C 将字符数组强制转换为结构指针

C 将字符数组强制转换为结构指针,c,pointers,struct,casting,C,Pointers,Struct,Casting,我正在努力理解下面的演员阵容 我对结构iphdr的成员变量存储在char array out\ U packet\ U buffer中的理解正确吗?在后面的代码中,永远不会使用out_数据包_缓冲区。相反,iphdr被memcpyied到uint8内存位置(以太帧)。但iphdr并不是唯一的 如果有人能指导我了解这里发生的事情,我将不胜感激 谢谢 我对结构iphdr的成员变量存储在char array out\ U packet\ U buffer中的理解正确吗 有点。在这个转换过程中,我们开始

我正在努力理解下面的演员阵容

我对结构iphdr的成员变量存储在char array out\ U packet\ U buffer中的理解正确吗?在后面的代码中,永远不会使用out_数据包_缓冲区。相反,iphdr被memcpyied到uint8内存位置(以太帧)。但iphdr并不是唯一的

如果有人能指导我了解这里发生的事情,我将不胜感激

谢谢

我对结构iphdr的成员变量存储在char array out\ U packet\ U buffer中的理解正确吗

有点。在这个转换过程中,我们开始“查看”从
&out\u packet\u buffer[0]
(或者只是
out\u packet\u buffer
)开始的内存块,作为
结构ip6\u hdr
而不是
char[]

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


正如@Christian Gibbons所说,我认为这也违反了UB的规定。看起来代码正在准备一个数据包,以便通过网络传输。数据包将由一个报头和一个有效负载组成。整个数据包大概存储在out_数据包_缓冲区中。ip6_头结构是它的前几个字节,数据有效负载紧随其后。使用头的结构可以使代码更可读,但在发送到套接字之前可能会有一个“结构顺序到网络顺序”函数


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

我很确定这会打破严格的别名。@Christiangibons感谢您指出这一点。帮助我编写它的改进版本。谢谢。据我所知,它为开发人员提供了对char缓冲区的方便且有组织的(作为结构)访问。但是,我希望输出包缓冲区被memcopy并传递给sendto函数,但事实并非如此。所以我看不到输出包缓冲区的使用。通过这种方式,您可以访问
iphdr->some_member
而不是访问
out_packet_buffer[M]
out_packet_buffer[N]
,然后在代码的后面,您希望out_packet_buffer被复制到以太帧中并发送帧,但事实并非如此。那么,为什么要使用/强制转换char数组出\u数据包\u缓冲区呢?正确。第588-592行将数据包元素(IP报头和有效负载)复制到以太网帧中,然后发送出去。然而,在第588行中,被复制的是iphdr。因此,我根本看不出有必要使用out\u packet\u缓冲区。这是一种分配大字节缓冲区的廉价方法,不会有未绑定指针的危险。只要它在范围内,它就会存在。也许最初的意图是将数据有效负载放在那个大缓冲区中。。。?仅复制ip头将是比该大缓冲区更小的副本。
char out_packet_buffer[4500] ;  
struct ip6_hdr *iphdr ;

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