Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 - Fatal编程技术网

c语言中超大内存指针的分配

c语言中超大内存指针的分配,c,pointers,struct,C,Pointers,Struct,我真的不明白写这篇文章的兴趣 struct iphdr *ip; struct icmphdr *icmp; char *packet; packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr)); ip = (struct iphdr *)packet; 为什么要将数据包作为字符,假设是这样,为什么不编写数据包=malloc(sizeof(struct iphdr))或更简单的ip=malloc(

我真的不明白写这篇文章的兴趣

   struct iphdr *ip;
   struct icmphdr *icmp;
   char *packet;
   packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr));
   ip = (struct iphdr *)packet;

为什么要将
数据包
作为
字符
,假设是这样,为什么不编写
数据包=malloc(sizeof(struct iphdr))或更简单的
ip=malloc(sizeof(struct iphdr))

根据wikipedia,icmp报头在IP报头之后立即启动,因此实现者会想到一起分配一块内存并使其指向数据包


您可以进一步检查代码,以进一步了解数据包的使用情况。数据包的全部内容可能被预先添加到上面层的一些数据中。

根据维基百科,icmp报头在IP报头之后立即启动,因此实现者会考虑一起分配一块内存,并使其指向数据包


您可以进一步检查代码,以进一步了解数据包的使用情况。数据包的全部内容可能被预先添加到上面层的一些数据中。

看起来代码正在分配一个IP数据包,其中嵌入了一个ICMP数据包作为IP有效负载。这就是为什么
malloc()
的大小足以容纳这两个结构的原因

这样做的原因是为了得到一块连续内存来表示数据包。如果您分别分配了
iphdr
icmphdr
,它们很可能位于内存的两个不相交部分,因此无法传递到
sendto()

注意,由于代码正在定义IP头
IP_HDRINCL
socket选项,因此必须在套接字上启用,以便套接字层不会自动生成IP头


数据包
看作一个大缓冲区。然后将
*ip
*icmp
设置为指向该缓冲区中的正确位置,以便可以使用结构对其进行初始化,而不必将原始字节复制到结构中。

看起来代码正在分配一个ip数据包,其中嵌入了一个icmp数据包作为ip有效负载。这就是为什么
malloc()
的大小足以容纳这两个结构的原因

这样做的原因是为了得到一块连续内存来表示数据包。如果您分别分配了
iphdr
icmphdr
,它们很可能位于内存的两个不相交部分,因此无法传递到
sendto()

注意,由于代码正在定义IP头
IP_HDRINCL
socket选项,因此必须在套接字上启用,以便套接字层不会自动生成IP头


数据包
看作一个大缓冲区。然后将
*ip
*icmp
设置为指向该缓冲区中的正确位置,以便可以使用结构对其进行初始化,而不必将原始字节复制到结构中。

它是否继续
icmp=(struct icmphdr*)(packet+sizeof(struct iphdr))?我猜作者希望结构彼此相邻以表示位置。好的,谢谢,这很有趣。它是否继续
icmp=(struct icmphdr*)(packet+sizeof(struct iphdr))?我猜作者希望结构彼此相邻以便于定位。好的,谢谢,这确实很有趣