可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?
我有一个像这样定义的简单C结构:
typedef struct LMWinData {
UInt8 itemTypeID;
UInt16 serviceID;
UInt16 methodID;
} LMWinData;
稍后在代码中我定义了一个类似这样的变量:
LMWinData lmWinData;
现在,如果我打印出这个变量的大小:
NSLog(@"data has size of %lu bytes", sizeof(lmWinData));
我没有按预期获得值(5个字节)。我改为6字节的大小。
那么,这里有什么不对?
非常感谢!
(我正在使用Mac OS X Lion。)
答案 0 :(得分:3)
您在此处看到对齐问题。在处理试图有效地建立软件访问位置的编译器时,这可能是一个棘手的问题。特别是,你有一个结构,其中两个16位整数跟随一个8位,导致16位整数从奇数位置开始,这通常很慢。
但是,有时这是必要的,并且用于控制对齐和填充的clang / llvm方法是__attribute__((packed))
。
或者,在你的结构上使用:
typedef struct LMWinData {
UInt8 itemTypeID;
UInt16 serviceID;
UInt16 methodID;
} __attribute__((packed)) LMWinData;
我认为这也适用于现代gcc。
答案 1 :(得分:0)
查看结构填充,对齐。有些方法可以在某些编译器中强制对齐:
typedef struct LMWinData {
UInt8 itemTypeID;
UInt16 serviceID;
UInt16 methodID;
} LMWinData __attribute__ ((aligned (1)));