union类型以其中size最大的为其大小
struct类型以其中所有size大小之和为其大小
struct和union的大小问题_c++#include<iostream>
struct和union的大小问题_c++
using namespace std;
struct和union的大小问题_c++
struct和union的大小问题_c++
int main()
struct和union的大小问题_职场_05
{
struct和union的大小问题_职场_06    typedef union 
{long i; int k[5]; char c;} DATE;
struct和union的大小问题_c++_07    
struct data int cat; DATE cow; double dog;} too;
struct和union的大小问题_休闲_08    DATE max;
struct和union的大小问题_休闲_08
struct和union的大小问题_休闲_08    cout
<<"sizeof(struct date)+sizeof(max) = "<<sizeof(too)+sizeof(max)<<endl;
struct和union的大小问题_休闲_08    cout
<<"sizeof(too) = "<<sizeof(too)<<endl;
struct和union的大小问题_休闲_08    cout
<<"sizeof(max) = "<<sizeof(max)<<endl;
struct和union的大小问题_休闲_08    cout
<<"struct data.cow size = "<<sizeof(too.cow)<<endl;
struct和union的大小问题_休闲_08    cout
<<"union DATE.i size = "<<sizeof(max.i)<<endl;
struct和union的大小问题_休闲_08    cout
<<"union char.c size = "<<sizeof(max.c)<<endl;
struct和union的大小问题_休闲_08
struct和union的大小问题_c++_17}
sizeof(struct date)+sizeof(max)返回52
struct和union的大小问题_c++#include<iostream>
struct和union的大小问题_c++
using namespace std;
struct和union的大小问题_c++
struct和union的大小问题_c++
int main()
struct和union的大小问题_休闲_22
{
struct和union的大小问题_休闲_08    typedef union student 
struct和union的大小问题_c++_24
{
struct和union的大小问题_休闲_08       
char name[10];
struct和union的大小问题_休闲_08       
long sno; 
struct和union的大小问题_休闲_08       
char sex; 
struct和union的大小问题_休闲_08       
float score [4]; 
struct和union的大小问题_休闲_29}
 STU; 
struct和union的大小问题_休闲_08
struct和union的大小问题_休闲_08STU a[
5];
struct和union的大小问题_休闲_08
struct和union的大小问题_休闲_08cout
<<sizeof(a)<<endl;
struct和union的大小问题_休闲_08
struct和union的大小问题_休闲_08
return 0;
struct和union的大小问题_休闲_08
struct和union的大小问题_c++_17}
 
初始化了一个含有5个UNION的数组,由于UNION以其中最大的元素float作为大小  16*5=80 

struct和union的大小问题_休闲_38#include<iostream>
struct和union的大小问题_休闲_38
using namespace std;
struct和union的大小问题_休闲_38
struct和union的大小问题_休闲_38
int main()
struct和union的大小问题_c++_42
{
struct和union的大小问题_c++_43    typedef 
struct student 
struct和union的大小问题_职场_44
{
struct和union的大小问题_c++_43       
char name[10];
struct和union的大小问题_c++_43       
long sno; 
struct和union的大小问题_c++_43       
char sex; 
struct和union的大小问题_c++_43       
float score [4]; 
struct和union的大小问题_职场_49}
 STU; 
struct和union的大小问题_c++_43
struct和union的大小问题_c++_43STU a[
5];
struct和union的大小问题_c++_43
struct和union的大小问题_c++_43cout
<<sizeof(a)<<endl;
struct和union的大小问题_c++_43
struct和union的大小问题_c++_43
return 0;
struct和union的大小问题_c++_43
struct和union的大小问题_职场_57}
 
输出为180
自然对齐(natural alignment)即默认对齐方式,是指按结构体的成员中(类型)size最大的成员作为基本的分配单元,而且与其顺序有这密切的联系。size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;Long sno; 4个字节;Char sex; 4个字节(这里对齐了);Float score [4]; 16个字节。于是(12+4+4+16)×5=180

struct和union的大小问题_休闲_38#include<iostream>
struct和union的大小问题_休闲_38
using namespace std;
struct和union的大小问题_休闲_38
struct和union的大小问题_休闲_38
int main()
struct和union的大小问题_c++_62
{
struct和union的大小问题_c++_43    typedef 
struct student 
struct和union的大小问题_职场_64
{
struct和union的大小问题_c++_43       
char name[10];
struct和union的大小问题_c++_43       
char sex; 
struct和union的大小问题_c++_43       
long sno; 
struct和union的大小问题_c++_43       
float score [4]; 
struct和union的大小问题_职场_49}
 STU; 
struct和union的大小问题_c++_43
struct和union的大小问题_c++_43STU a[
5];
struct和union的大小问题_c++_43
struct和union的大小问题_c++_43cout
<<sizeof(a)<<endl;
struct和union的大小问题_c++_43
struct和union的大小问题_c++_43
return 0;
struct和union的大小问题_c++_43
struct和union的大小问题_职场_57}
 

答案是:160. 为什么,只是换了顺序而已呀?关键就在顺序上。

结构体中,size最大的是long,size是 4,所以,按照顺序,Char name[10];12个字节;但是这12中多分配的2个字节可以包含后面的Char sex; (问题就在这Float score [4]; 16个字节。于是(12+4+16)×5=160