首先我们要了解两者分别是什么?
1. 结构体(struct)
在C语言中,结构体是一种可自定义的数据类型,可以用于声明变量、指针或数组。结构体的特点在于其是一些元素的集合,这些元素可以是变量,可以是数组,可以是指针,它们完全由程序员指定,这些元素被称为结构体的成员。
例如:创建一个学生信息(Stu_Info)的结构体,成员:名字(Name)、年龄(Age)、性别(Sex)、成绩(Score)。则结构体的一般定义如下:
使用结构体(Stu_Info)定义结构体变量(stu)并使用,示例如下:
2. 共用体(union)
在C语言中,共用体也称为联合体,也是一种自定义的数据类型。其特点是可以有多个成员(成员的类型是由程序员指定的),但是在任何时候都只能有一个成员有值。其提供了一种使用相同的内存位置的有效方式。
共用体的使用在代码书写上和结构体很相似:
由这个示例可验证共用体Uni的成员a、b是共用存储空间的,我们可以采用这种方式获取计算机的存储方式(大小端序)。
区别
二者的区别是什么呢?答:内存占用。
结构体作为成员的集合,其各自成员拥有自己的内存,互不影响。并且结构体变量的长度计算规则:在遵循内存对齐原则,为所以成员长度之和。
共用体的成员共用存储空间,成员的使用上是互斥的。共用体变量的长度计算规则:足够容纳最宽的成员,并且能被所有成员数据类型的长度的整数倍。
对64位机下结构体和共用体计算长度,示例如下:
对Str结构体,最大的数据类型为double,在64位机占8个字节,按照8字节对齐。成员a长度8+1,多出的部分与成员b组成8个字节,成员c占8个字节,所以总共24字节。
对Uni共用体,最宽成员为a,9个字节,所以至少大于9。最大数据类型double,所以为8字节的整数倍,计算结果16字节。