当前位置: 代码迷 >> C语言 >> 已解决 结构体大小
  详细解决方案

已解决 结构体大小

热度:296   发布时间:2006-09-05 16:42:25.0
已解决 结构体大小

typedef unsigned char U8; /// 1 byte
typedef unsigned int U32; /// 4 byte
typedef unsigned short U16; /// 2 byte

typedef struct frame_head
{
U8 dest[6];
U8 src[6];
U16 protocol;
}frame_head_t; <1>

typedef struct frame_body
{
frame_head_t head;
U32 content1;
U32 content2;
}frame_body_t; <2>



上面两个标号的变量 字节长度是多少?我觉得是14和22 但是程序运行的结果是14和24
想请教为什么。谢谢

[此贴子已经被作者于2006-9-5 17:19:53编辑过]

搜索更多相关的解决方案: 结构体  frame  typedef  head  byte  

----------------解决方案--------------------------------------------------------
以下是引用saya在2006-9-5 16:42:25的发言:

typedef unsigned char U8; /// 1 byte
typedef unsigned int U32; /// 4 byte
typedef unsigned short U16; /// 2 byte

typedef struct frame_head
{
U8 dest[6];
U8 src[6];
U16 protocol;
}frame_head_t; <1>

typedef struct frame_body
{
frame_head_t head;
U32 content1;
U32 content2;
}frame_body_t; <2>



上面两个标号的变量 字节长度是多少?我觉得是14和22 但是程序运行的结果是14和24
想请教为什么。谢谢

sizeof(struct frame_head)真的是14么,应该是16,LZ不妨试试。
所以才会产生LZ疑虑22和24的问题。

sizeof的结果等于对象或者类型所占的内存字节数。所以在struct frame_body中定义了frame_head_t head,这里的head实际占的内存大小是16(根据字节对齐原则,应为2的幂)。


----------------解决方案--------------------------------------------------------
试过了 是14 你可以自己试一下 由于字节对齐 导致的第二个变量的长度为24
----------------解决方案--------------------------------------------------------
总结个规律把:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
----------------解决方案--------------------------------------------------------
  相关解决方案