在C语言编程中,大多时候变量都是独立的,没有联系的。但是,在实际情况中,多个变量之间是有着联系,成组出现的。这个时候我们会想把这些数据放在一个数组里面,但是,数组只能存放同数据类型的变量,这时,我们可以创建一个结构体来存放不同数据类型,但是成组出现的一些变量。
typedef struct Student
{
int num;//学号
char name[20];
int score;
}Student;
这是一个简单的student结构体,里面我们定义了学生的学号,姓名,成绩。我们此时把不同类型的数据组合在一起成为一个结构体,但是一个int型变量的大小是4个字节,一个char类型变量的大小是1个字节,这个结构体会有多大呢?
我们来看下这个结构体有多大!
#include <stdio.h>
struct Student
{
int num;//学号
char name[10];
int score;
}Student;
int main()
{
struct Student t1;
printf("%d\n",sizeof(struct Student);
return 0;
}
我们发现,这个结构体的大小不是4+10+4个字节 这是为什么呢?
我们来从一个简单的结构体来分析
struct E
{
int a;
char b;
}
结构体若是想上面的方式排列,可以省下些许空间,但是计算机为了要快速读写,需要进行字节对齐。
即结构体变量的每一个类型字节都可以被其中最大类型字节整除;而且结构体的总大小要可以整除结构体中最大类型的整数倍。
所以上图的结构体的大小其实是为 4+1+3,来进行字节对齐。此时我们回到我们定义的结构体来计算一下所占字节。
int num; num是个整型数据占4个字节。
char name[10]; name[10]是10个char类型的数据,所以此时的大小为10个字节,但是为了字节对齐,我们给它加2个字节变为12个字节,此时便是num字节的整数倍。
int score;score和num一样是整型数据 占4个字节。
所以整体的大小为20个字节,再看其中最大类型 是Int型变量,20正好是4的倍数,完美!
下面再给些实例来巩固一下:
struct A
{
char a;// 1+1
short b;//2
int c;//4
}//总体大小为8个字节
struct B
{
char a;//1+3
int b;//4
}//总体大小为8个字节
struct C
{
char a;//1+3
int b;//4
float c;//4+4
double d;//8
};//24
struct D
{
int a;//4
char b;//1
};//5+3 满足结构体大小要整除最大类型数据
struct F
{
char a;//1+3
int b;//4
short c;//2
};//10+2