在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

相关文章: