结构体大小是考试常考也是重点的内容。
结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。然后我们看一个名词,这个名词是从网上看到的定义--偏移量。偏移量指的是结构体变量中的成员的地址和结构体变量地址的差。用一个图来解释
如果是第一个,那么明显105不能整除4,下面的一个空掉三个格子,108就可以整除4,因此应该为8
下面练习几个:
struct A
{
int a;//4
int b;//4
} //8
这个结构体长度就是8
struct C
{
char a;//1+1
short b;//2
int c;//4
}
这个结构体大小应该为8
而下面一个例子就不同于上面的了
struct C
{
short a;//2
char b;//1+5
double c;//8
int *d;//4
float e;//4
这个结构体的大小就是24.short类型是2,char类型是1,而double类型是8,所以前面要能被8除尽,然后总和。
重点来了:
1.结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍);
2.结构体大小必须是 “所有”成员大小的整数倍,记住是所有。
这些都不难从上面看出
下面还有别的类型的例子,一起看看:
struct EE
{
int a;
float b;
}
struct E
{
char c;
struct EE d;//8
可以自己想想这个结构体大小是多少
是12. 对了吗?看看原因
int 和 float 都是4,char 是1 ,那么先看E这个结构体,char就应该为1+3,而有人就会算为16,想着EE是8,就还得加4,那就是8+8就是16,不对的。最终值能整除单个最大数据类型,是单个,所以4+8就行了,就是12啦。
再看看几个吧:
struct F
{
char c;//1+7
double d;//8
)//为16
struct G
{
int a;//4
char b;//1
}那么这个呢也是8,不要以为它是5,看图:
以数组来说的话105就不可以除尽,不行
相似例子:
struct H
{
char a;//1+3
int b;//4
short c;//2
}//12
有人会算为10,不对的 ,前面有说过要是所有成员的整数倍,而10不能除尽4,应为12
那么,怎么求这个长度呢,对于32位系统来说,用sizeof(char)=1,sizeof(int)=4就ok。
差不多分析完了,希望对你有用!