"packed" 之后的结构仍然比应有的大

structure after "packed" still bigger than it should be

问题已解决。错误是没有重新考虑给定的数据类型... 以下结构的大小大于应有的大小:

typedef unsigned char    byte;
typedef unsigned short   word;
typedef unsigned long    dword;

struct Y
{
 short      h;
 byte       i;       
}
#if defined (__GNUC__)
    __attribute__((__packed__));
#endif

struct X
{
   short    a;
   byte     b;
   byte     c;
   word     d;
   dword    e;
   byte     f;
   byte     g;
   word     h;
   short    i;
   struct Y G[8];
}
#if defined (__GNUC__)
    __attribute__((__packed__));
#endif

printf("size of X should be 40 but is %i", sizeof(struct X));

输出:

size of X should be 40 but is 44

我需要这个大小为 40 字节(所有元素的总和)的结构,44 是我能达到的最低值。编译器是 GCC C,byteunsigned charwordunsigned shortdwordunsigned longsizeof(Y)是3,这里有什么问题?

您定义的类型有缺陷。理想情况下,我认为 dword 应该是 word 大小的两倍,但您将两者定义为:

typedef unsigned short   word;  
typedef unsigned long    dword; 

事实证明,在您的平台上 sizeof(unsigned short)2,而 sizeof(unsigned long)8 不是 4.

你真的应该避免这样的定义并使用 stdint.h:

中提供的标准类型
byte  -> uint8_t
short -> uint16_t
word  -> uint16_t
dword -> uint32_t

最后,如果未定义宏 __GNUC__,则您的结构声明无效,因为您会遗漏最后的分号 (;)。你可以把它改成这样:

#if defined (__GNUC__)
__attribute__((__packed__))
#endif
struct Y
{
 uint16_t h;
 uint8_t  i;       
};