结构体是C语言的一种数据类型,是一种多种基本数据类型混合的类型。既然他是数据类型,那么就有数据类型在内存中所占字节数,即大小。如何计算数据类型的大小呢?是简单的将一个个简单数据类型的大小相加吗?还是有自己特殊的存储方式?
我们这里先通过举多个例子来看看实际运行的结果,然后再讨论规律。
struct stu //例子1
{
int a;
char b;
char c;
}stu;//8字节
struct stu//例子2
{
char a;
int b;
char c;
}stu;//12字节
struct stu//例子3
{
short a;
char b;
char c;
}stu;//4字节
struct stu//例子4
{
short a;
char b;
short c;
}stu;//6字节
struct stu//例子5
{
short a;
int b;
short c;
}stu;//12字节
struct stu//例子6
{
short a;
double b;
short c;
}stu;//24字节
struct stu//例子7
{
char a;
double b;
char c;
}stu;//24字节
struct stu//例子8
{
int a;
int b;
double c;
}stu;//16字节
struct stu//例子9
{
char a;
char b;
double c;
}stu;//16字节
struct stu//例子10
{
double a;
char b;
char c;
}stu;//16字节
每个例子的结果你都知道为什么了吗?如果还没有猜出来原因,那我们在这里进行详细讲解。
可能很多书上都有会对结构体的大小有详细的概念,但是概念总归是概念,我在这里主要是帮助你们理解和计算,不是将概念原封不动的给你们。
我自己对结构体大小的判断是通过这个方法:先看结构体中最大的元素有多大,如果最大的是double,则最大为8字节,如果是int,则最大为4字节。这样先拿到一个最大的对齐数。然后我们开始看结构体的大小,从第一个元素开始,先确定第一个元素的大小,如果第一个元素所占字节数小于最大对齐数,那我们用最大对齐数减去第一个元素所占字节数,然后用这个剩余空间的字节数和第二个元素所长字节数进行对比,如果第二个元素可以放进剩余的空间中,那就将第二个元素放进剩余空间中,以此类推,直到接下来的一个元素不能放进剩余空间中,那就为这个元素重新开辟一块最大对齐数的空间,继续上面的过程,这样最终开辟了几个最大对齐数的空间,就是这个结构体的大小。
以上的方法在vs和Linux环境下均可以实现,看了这篇博客后,希望你可以在你自己的平台上试一下,掌握结构体大小的计算。