"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,byte
是 unsigned char
,word
是 unsigned short
,dword
是 unsigned long
。 sizeof(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;
};
问题已解决。错误是没有重新考虑给定的数据类型... 以下结构的大小大于应有的大小:
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,byte
是 unsigned char
,word
是 unsigned short
,dword
是 unsigned long
。 sizeof(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;
};