2012-06-20 148 views
3

可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?C结构的大小

我有这样定义的简单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

看看结构填充,对齐。有些方法可以在某些编译器中强制对齐:

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

非常感谢!我使用了'编译包(1)'方法,解决了这个问题。 –

3

您在这里看到对齐问题。在处理试图高效地创建软件访问位置的编译器时,这可能是一个棘手的问题。特别是,你有一个结构,其中两个16位整数跟随一个8位,导致16位整数在奇数位置开始,这通常很慢。

但是,在有必要的情况下,用于控制对齐和填充的clang/llvm方法是__attribute__((packed))

,或者对你的结构使用:

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

我认为这也适用于现代GCC,以及。