如何解决“打包”后的结构仍然比它应该的大
问题解决了。错误在于没有重新考虑给定的数据类型... 以下结构的大小大于应有的大小:
obj_instance.name=('Name')
输出:
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));
我需要这个大小为 40 字节(所有元素的总和)的结构,44 是我能达到的最低值。编译器为 GCC C,size of X should be 40 but is 44
为 byte
,unsigned char
为 word
,unsigned short
为 dword
。 unsigned long
是 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;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。