当前位置: 技术问答>linux和unix
结构内长度不一致的情况
来源: 互联网 发布时间:2015-03-15
本文导语: 在linux下,定义了一个结构 struct etherpacket { struct ethhdr ep; struct iphdr ip; char buf[leng]; }; 其中ethhdr合iphdr都是系统中的结构,如下 struct ethhdr { unsigned char h_dest[6]; unsigned char h_source[6]; unsigned short h_proto; }; struct...
在linux下,定义了一个结构
struct etherpacket
{
struct ethhdr ep;
struct iphdr ip;
char buf[leng];
};
其中ethhdr合iphdr都是系统中的结构,如下
struct ethhdr
{
unsigned char h_dest[6];
unsigned char h_source[6];
unsigned short h_proto;
};
struct iphdr {
__u8 version:4,
ihl:4;
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};
现在定义了一个etherpacket类型的变量a, 想取其成员ip的地址,但是老是不对,总是差2.
用sizeof(struct ethhdr)得到14,但是看&a.ip和&a,值却是16.
请问是怎么回事
struct etherpacket
{
struct ethhdr ep;
struct iphdr ip;
char buf[leng];
};
其中ethhdr合iphdr都是系统中的结构,如下
struct ethhdr
{
unsigned char h_dest[6];
unsigned char h_source[6];
unsigned short h_proto;
};
struct iphdr {
__u8 version:4,
ihl:4;
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};
现在定义了一个etherpacket类型的变量a, 想取其成员ip的地址,但是老是不对,总是差2.
用sizeof(struct ethhdr)得到14,但是看&a.ip和&a,值却是16.
请问是怎么回事
|
#progma pack(1)
.....
.....
#progma pack();
.....
.....
#progma pack();
|
结构应对齐。
#pragma pack(push,1)
....
#pragma pack(pop)
应该用上面的语句将你的定义处封起来,struct iphdr,struct ethhdr结构的定义也应该封起来。如果你要那样做,可以重新定义struct iphdr和struct ethhdr,将它和你上面的定义放在一起,用上面的语句封起来。
#pragma pack(push,1)
....
#pragma pack(pop)
应该用上面的语句将你的定义处封起来,struct iphdr,struct ethhdr结构的定义也应该封起来。如果你要那样做,可以重新定义struct iphdr和struct ethhdr,将它和你上面的定义放在一起,用上面的语句封起来。
|
4字节对齐,编译器会自动将不足4字节的数据对齐为4字节长度。如
struct {
char a;
int b;
char b;
}长度为12。
struct {
char a;
char c;
int b;
}长度为8。
struct {
char a;
int b;
char b;
}长度为12。
struct {
char a;
char c;
int b;
}长度为8。
|
系统内的struct是结构对齐的,意思就是以最长的字节对齐