C中的结构尺寸

Sud*_*eer 0 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"); }
Run Code Online (Sandbox Code Playgroud)

我的输出是:

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

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

Bas*_*tch 5

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

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

struct student {
 char name;
 int age;
 float weight;
};
Run Code Online (Sandbox Code Playgroud)

该字段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编译器提供了一个很好的扩展:__alignof__和相关类型的属性.

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