参考:Difference between Structure and Union in C
二者区别
struct
这里不做详细说明,因为参考链接中都写明了。只做一些重点强调。
struct
中声明的变量,在分配空间的时候,struct结构空间大小,大于等于其内部所有变量大小的总和,一般会大于,因为需要字节对齐。
我们看一个例子
#include <stdio.h>struct MyStruct
{char c;int a;char x;double b;
};int main()
{MyStruct s;s.c = 'c';s.a = 1000;s.x = 'D';s.b = 11.5;return 0;
}
我们依次看看其赋值情况,就可以知道内存分布了。
执行s.c = 'c'
执行s.a = 1000
可以看到,中间跳过了3个字节,因为int
需要4字节对齐。
继续执行s.x = 'D'
s.b = 11.5
double需要8字节对齐,因此中间跳过了7个字节。
所以对于结构体来说,其内存分布是
所以结构体大小是24字节
验证一下,没什么问题。
对于结构体,没什么好说的,无非就是有相关需求,需要一个结构,有不同的数据类型。
值得说明的是,结构体可以嵌套,例如:
struct{struct{struct{...}}int x;
}
访问上来说,如果没名字,就直接访问,有名字就多几个.
,指的是这种命名
struct{}name;
不过嵌套结构似乎很少用吧…
union
最大的区别就是,联合体中定义的不同数据类型,在分配空间的时候是重叠的,也就是说,它的大小应该以占用最大空间的内个为准,要等于它的大小。
#include <stdio.h>union MyUnion
{int a;double b;char c;
};int main()
{MyUnion b;b.a = 10;b.b = 1.0;b.c = 'a';return 0;
}
b
的大小是8,也就是最大的double
的大小。
我们依次运行看看:
b.a = 10
b.b = 1.0
b.c = 'a'
你会发现,都是在这8字节的空间内进行的!
但是注意覆盖问题。
对于同一块8字节的内存空间,覆盖的时候,只覆盖自己占的地方,例如,对于8字节空间,改变占1字节的char
的时候,只覆盖第一个字节,剩下的7字节保持不变。
最后,它也同样可以嵌套。
至于访问的时候的变化,只需要明确,访问的都是对应大小的内存单元。
因此,不管谁改,都是该内存,至于值
- 如果访问的是double,就是把这8个字节转换为double
- 如果访问的是int,就把前4个字节转换为int
- char同理。