C中的结构尺寸

时间:2014-07-11 07:16:18

标签: c

在C

中查找结构的大小

struct student
    {
     char name;
     int age;
     float weight;
    };

main () { int i,j,k,l; struct student s1; i=sizeof(s1.name); j=sizeof(s1.age); k=sizeof(s1.weight); l=sizeof(s1); printf ("\n size of name %d",i); printf ("\n size of age %d",j); printf ("\n size of weight %d",k); printf ("\n size of s1 %d",l);

printf("\n"); }

我的输出是:

size of name 1 size of age 4 size of weight 4 size of s1 12

但结构大小应该是其成员大小的总和。为什么我得到12而不是9作为结构变量s1的大小。有人可以解释什么是错的。

1 个答案:

答案 0 :(得分:5)

出于性能或硬件原因,结构中的字段应适当对齐。阅读data structure alignment(详情取决于目标处理器和ABI)。

在x86-64 / Linux上的示例中:

struct student {
 char name;
 int age;
 float weight;
};

字段name没有对齐要求。 字段age需要4个字节对齐到4的倍数 字段weight需要4个字节与4的倍数对齐

因此整体struct student需要12个字节与4的倍数对齐

如果weight被声明为double,则需要将8个字节与8的倍数对齐,整个结构需要16个字节与8对齐。

顺便说一下,name字段的类型错误。通常名称不止一个char。 (我的姓氏需要13个字母+终止空字节,即14个字节)。可能你应该将它声明为指针char *name;(8个字节对齐到8)或数组,例如char name[16];(16个字节与1个字节对齐)。

GCC compiler提供了一个不错的扩展程序:__alignof__和相关的type attributes

如果性能或大小对您很重要,则应按struct的顺序将字段放入对齐要求降低的顺序(通常从double字段开始,然后是long和指针,等...)