C中的结构尺寸


Sizeof Structure in C

本问题已经有最佳答案,请猛点这里访问。

在C中查找结构的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct student
    {
     char name;
     int age;
     float weight;
    };
</p>

<p>
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 ("
 size of name    %d"
,i);
    printf ("
 size of age     %d"
,j);
    printf ("
 size of weight  %d"
,k);
    printf ("
 size of s1      %d"
,l);
</p>

<wyn>printf("
"
);
}

我的输出是:

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

但是结构尺寸应该是其成员尺寸的总和。为什么我得到12而不是9作为结构变量s1的大小。有人能解释一下怎么了吗?


出于性能或硬件原因,结构中的字段应适当对齐。阅读有关数据结构对齐的信息(详细信息取决于目标处理器和ABI)。

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

1
2
3
4
5
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字段类型错误。通常名称不止一个字符。(我的姓氏需要13个字母+终止的空字节,即14个字节)。可能您应该将其声明为指针char *name;(8字节与8对齐)或数组,例如char name[16];(16字节与1字节对齐)。

gcc编译器提供了一个很好的扩展:__alignof__和相关的类型属性。

如果性能或大小对您很重要,则应将字段放入struct中,以减少对齐要求(因此通常从double字段开始,然后是long和指针等…)