注册 登录
编程论坛 C语言论坛

结构体指针移动后指针位置重叠求助

zhouhongye 发布于 2021-12-17 16:05, 1467 次点击
别人写的代码有一行没看懂,大体如下:
struct myhdr
{
    uint32_t src_ip;
    uint32_t dst_ip;
    uint8_t zero;
    uint8_t protocol;
    uint16_t udp_len;
};
    static char buffer[2049];
    struct iphdr        *ip_header;
    struct udphdr       *udp_header;
    struct myhdr        *my_header;

ip_header = (struct iphdr *)buffer;
udp_header = (struct udphdr *)(ip_header + 1);
my_header = (struct myhdr *)((char *)udp_header - sizeof(struct myhdr));
这里my_header不是指向了ip_header的内存了么,之后分别给my_header、ip_header赋值内存是怎么分配的?udp_header的指针自动向右移动嘛?
4 回复
#2
diycai2021-12-17 16:15
结构体iphdr和udphdr的定义都看不到。
你对指针的理解还是有问题,首先这3个都是指针, 指向的内存如下:
ip_header 指向 buffer[0]
udp_header 指向 buffer[sizeof(struct iphdr)]
my_header 指向 buffer[sizeof(struct iphdr) - sizeof(struct myhdr)]
#3
zhouhongye2021-12-17 16:30
回复 2楼 diycai
iphdr和updher是netinet/ip.h和udp.h定义的
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;
    __be16 -tot_len;
    __be16 -id;
    __be16 -frag_off;
    __u8    ttl;
    __u8    protocol;
    __be16 -check;
    __be32 -saddr;
    __be32 -daddr;
};
struct udphdr {
        __u16   source;
        __u16   dest;
        __u16   len;
        __u16   check;
};
iphdr长度是20   ip_head指向buff[0]  my_head指向buff[8]  那给ip_head赋值之后,不会覆盖my_head吗,新手上路,理解的有问题多指教,多谢
#4
diycai2021-12-17 16:42
回复 3楼 zhouhongye
覆盖是合法的,可以互相包含,甚至强制转换,推测可能是两个结构体公用其中的几个成员。
#5
zhouhongye2021-12-17 17:12
回复 4楼 diycai
自己写了个测试,确实会覆盖,那感觉是代码有点问题,多谢了
1