标题:结构体指针移动后指针位置重叠求助
只看楼主
zhouhongye
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2021-12-17
结帖率:100%
已结贴  问题点数:20 回复次数:4 
结构体指针移动后指针位置重叠求助
别人写的代码有一行没看懂,大体如下:
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的指针自动向右移动嘛?
搜索更多相关主题的帖子: 指针 位置 移动 结构体 struct 
2021-12-17 16:05
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
结构体iphdr和udphdr的定义都看不到。
你对指针的理解还是有问题,首先这3个都是指针, 指向的内存如下:
ip_header 指向 buffer[0]
udp_header 指向 buffer[sizeof(struct iphdr)]
my_header 指向 buffer[sizeof(struct iphdr) - sizeof(struct myhdr)]
2021-12-17 16:15
zhouhongye
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2021-12-17
得分:0 
回复 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吗,新手上路,理解的有问题多指教,多谢
2021-12-17 16:30
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:20 
回复 3楼 zhouhongye
覆盖是合法的,可以互相包含,甚至强制转换,推测可能是两个结构体公用其中的几个成员。
2021-12-17 16:42
zhouhongye
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2021-12-17
得分:0 
回复 4楼 diycai
自己写了个测试,确实会覆盖,那感觉是代码有点问题,多谢了
2021-12-17 17:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507901-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.181644 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved