微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中使用结构的指针

如何解决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 举报,一经查实,本站将立刻删除。