如何解决C中使用结构的指针
我是C编程新手,正在学习指针。 有人可以解释下面的代码是什么意思吗?
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};
struct icmphdr
{
u_int8_t type; /* message type */
u_int8_t code; /* type sub-code */
u_int16_t checksum;
union
{
struct
{
u_int16_t id;
u_int16_t sequence;
} echo; /* echo datagram */
u_int32_t gateway; /* gateway address */
struct
{
u_int16_t __unused;
u_int16_t mtu;
} frag; /* path mtu discovery */
} un;
};
char datagram[4000];
struct iphdr *iph = (struct iphdr *) datagram;
struct icmphdr *icmphd = (struct icmphdr *) (datagram + sizeof (struct iphdr)); // what does this line do?
这是做什么的?字母是数组的地址,我们在其中添加一些整数。它在类型转换中返回什么? 记录是其他结构。
解决方法
确实,启动C不是一个好习惯;但无论如何:
char数据报[4000];
表示4000个8位元素。
struct iphdr * iph =(struct iphdr *)数据报;
此行尝试将数据报数组的第一个元素的地址强制转换为 iphdr 变量。由于 iphdr 包含21 * 8bit,因此从数据报数组的第一个元素到第21个元素都可以通过 iphdr 结构和 iph 指针进行访问。例如:
iph->tos
等于datagram[2]
struct icmphdr * icmphd =(struct icmphdr *)(数据报+ sizeof(struct iphdr));
此行表示从数组开始到 iphdr 大小的跳转;因此,这意味着恰好在通过 iph 指针无法访问的数组部分之后,可以通过 icmphd 指针进行访问。由于 icmphdr 是8个字节,因此可以使用 icmphdr 指针访问8个字节。用另一种语言,可以通过 icmphdr 结构访问数据报数组的第22个元素到第29个元素。例如:
icmphd->code
等于datagram[22]
icmphd->un.echo.id
等于datagram[25],datagram[26]
icmphd->un.echo.gateway
等于datagram[25],datagram[26],datagram[27],datagram[28]
icmphd->un.frag.mtu
等于datagram[27],datagram[28]
该程序尝试将原始数据( datagram )映射到具有特定含义的结构化数据。也许您是从网络上收到的数据报,而发件人给您的数据结构为( iphdr 和 icmphdr )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。