结构体是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环境下均可以实现,看了这篇博客后,希望你可以在你自己的平台上试一下,掌握结构体大小的计算。