C++ 结构断层的结构

C++ 结构断层的结构,c++,C++,我试图为一个数据包创建一个结构,并将一个ip_头和udp_头放入其中,但当它到达代码的那个部分时,它会出错。我在这件事上已经坚持了很长一段时间了,我被难住了 /* IP header struct */ struct ip_header{ unsigned char iph_ihl:5, iph_ver:4; unsigned char iph_tos; unsigned short int iph_len; unsigned short

我试图为一个数据包创建一个结构,并将一个ip_头和udp_头放入其中,但当它到达代码的那个部分时,它会出错。我在这件事上已经坚持了很长一段时间了,我被难住了

/* IP header struct */
struct ip_header{
    unsigned char       iph_ihl:5, iph_ver:4;
    unsigned char       iph_tos;
    unsigned short int  iph_len;
    unsigned short int  iph_ident;
    unsigned char       iph_flag;
    unsigned short int  iph_offset;
    unsigned char       iph_ttl;
    unsigned char       iph_protocol;
    unsigned short int  iph_chksum;
    unsigned int        iph_sourceip;
    unsigned int        iph_destip; 
};

/*UDP header struct */
struct udp_header{
    unsigned short int udph_srcport;
    unsigned short int udph_destport;
    unsigned short int udph_len;
    unsigned short int udph_chksum;
};

/* Packet struct */
struct packet{
    ip_header ip_hdr;
    udp_header udp_hdr;
    string buffer;
};

int main( int argc, char **argv )
{
    string ip_line;
    string message_line;
    get_input( ip_line, message_line );

ip_header i = create_ip_header( address, ip_line );
udp_header u = create_udp_header();

cout << "IP len\t" << i.iph_len << endl;
cout << "UDP len\t" << u.udph_len << endl;

packet *pkt = ( struct packet* )(i.iph_len + u.udph_len + sizeof( message_line ));


//SEGFAULTS HERE
pkt->ip_hdr = i;
pkt->udp_hdr = u;
pkt->buffer = message_line;
/*IP头结构*/
结构ip_头{
未签名字符iph\u ihl:5,iph\u版本:4;
未签名字符iph_tos;
无符号短整数iph_len;
无符号短整数识别码;
无符号字符iph_标志;
无符号短整数iph_偏移量;
无符号字符iph_ttl;
无符号字符iph_协议;
无符号短整数iph_chksum;
未签名的int-iph\u-sourceip;
未签名的int iph_destip;
};
/*UDP头结构*/
结构udp_头{
无符号短int-udph\u srcport;
未签名的短int-udph\u destport;
无符号短int-udph_len;
无符号短int-udph_-chksum;
};
/*数据包结构*/
结构包{
ip_头ip_hdr;
udp_头udp_hdr;
字符串缓冲区;
};
int main(int argc,字符**argv)
{
串ip_线;
字符串消息行;
获取输入(ip线、消息线);
ip_头i=创建_ip_头(地址,ip_线);
udp_头u=创建udp_头();
cout这一行是错误的:

packet *pkt = ( struct packet* )(i.iph_len + u.udph_len + sizeof( message_line ));
您不能将指针设置为一组长度和大小的总和,它需要指向已分配的对象。它应该是:

packet *pkt = new packet;

不要把它都标记为代码> C++ <代码>和<代码> C++ >代码> .<代码> STD::String 使它仅为C++。你将一堆大小和投给一个结构指针。这绝对没有意义。你需要分配结构。我猜我是盲目地遵循示例代码。你能解释一下为什么会这样吗?
char-ipbuf[8192];结构ip_头*ip=(结构ip_头*)ipbuf;
@Barmar
ipbuf
是一个数组,数组用作值时会衰减为指针。因此,您只是将一种类型的指针转换为另一种类型。将其与原始代码进行比较,原始代码中没有任何值是数组。@JohnTunisi您的代码类似于执行
struct ip_header*ip=(struct ip_header*)8192;