sizeof(结构体)
因为要字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不。
如:整型(int)数据占4个字节,字符型(char)数据占一个字 节,短整型(short)数据占两个字节
二、字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
例1:
#include <stdio.h>
struct A
{
char i;
int j;
};
struct B
{
char a;
struct C
{
char x;
int y;
};
char b; //这里因为char后面补了3个字节所以加上c,d,e,整体的结构体大小仍然不变
//char c;
//char d;
//char e;
//char f; //如果加到4个字节,超出一个字节,遵循是最宽基本类型成员的整数倍,所以此时结构体大小为20。在char f后补了三个字节的大小!
};
int main()
{
struct A stu1;
struct B stu2;
printf("%d\n",sizeof(stu1));
printf("%d\n",sizeof(stu2));
return 0;
}
对于结构体A,最宽的是int占用4个字节,A中的char占用1个字节,编译器开始在char的后面填充3个字节,使得int相对于A的偏移量是4。所以sizeof(A) = 8
对于结构体B,
(1)char a的长度应该是拆开结构体的基本类型和B中基本类型最宽基本类型成员的整数倍,也就是4。
(2)C是结构体,有自己的对齐字节数,sizeof(A)=8。
(3)最后的char b字节长度是1,所以总长度是:4+8+1=13,但是要遵循是最宽基本类型成员的整数倍,所以要再填充3个字节,就是16。sizeof(B) = 16
含有数组的结构体
#include <stdio.h>
struct S
{
char p;
int arr[3];
float q;
};
int main ()
{
struct S stu3;
printf("%d",sizeof(stu3));
return 0;
}
输出结果
20
sizeof(S)大小是20,char:1, int arr[3] : 4*3 ,float : 4;所以总的大小是17,根据上面的原则3,是最宽字节的整数倍,所以是20字节。