突然发现以前理解的结构体占用的字节数错了,以为是里面各个元素占的字节数总和,哎,发现自己c语言基础太差。
一,如果结构体中不含有数组如下s1,s2:
struct
{
short a; //2 2
char b; //1 1
// 1 (4)
float c; //4 4
}s1; //8
struct
{
char a; //1
int b; //4
//3 (8)
double c; //8
}s2; //16
先找出元素类型中占用字节最大的值max,然后按照max字节对齐方式,逐个分配内存空间。
如上面s1,max=sizeof(float)=4,a为short占2,因为4字节照齐,所以还有2,然后分配b一个字节,还剩一个空,接着c占4个字节。最终8字节一定是max的整数值。s2呢,a占1个字节,加7个字节补齐,b占4字节,所以,7字节中4个分配给b,还剩3个补齐,接着c分配8个,s2总共16字节。
二,如果结构体中含有数组的话,其实也是一样的,不过麻烦点而已。
struct
{
char ch[10]; //1 10
// 6 (16)
double d; //8 8
int a; //4 8
}s3; //32
struct
{
char ch[10]; //1 10
int a; //4 4
// 2 (16)
double d; //8 8
}s4; //24
如上s3,max=sizeof(double)=8,所以是8字节照齐,以为sizeof(ch)本身占10,所以还有6字节补齐(d占用8个字节),然后d分配8个字节,最后a分配4个字节,再加4字节补齐,所以sizeof(s3)=32。如果改变其中的顺序,也会重新改变的,如s4,ch占10个字节,然后加6字节补齐,但是下一个a占4字节,所以6个字节中4个分配给a,还余2字节。接着d分配8字节,sizeof(s4)=24。
三,union中元素占用同一片空间,计算类似于struct。