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