C结构体的大小

3

可能重复的问题:
为什么结构体的sizeof不等于各成员sizeof之和?

我有一个简单的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。)

2个回答

3
您在这里看到了一个对齐问题。当编译器试图使软件访问位置更加高效时,这可能是一个棘手的问题。特别是,您有一个结构,在其中两个16位整数跟随一个8位整数,导致16位整数从奇数位置开始,这通常是缓慢的。
然而,有些情况下这是必要的,而clang/llvm控制对齐和填充的方法是__attribute__((packed))。
或者,可以在您的结构上使用:
typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} __attribute__((packed)) LMWinData;

我认为这在现代的gcc中也可以运行。


0

看一下结构体填充和对齐。在某些编译器中,有强制对齐的方法:

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} LMWinData __attribute__ ((aligned (1)));

非常感谢!我使用了“pragma pack(1)”方法,问题得到了解决。 - phranck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接