C语言中的struct和union区别

  

参考: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字节保持不变。

最后,它也同样可以嵌套。

至于访问的时候的变化,只需要明确,访问的都是对应大小的内存单元

因此,不管谁改,都是该内存,至于值

  1. 如果访问的是double,就是把这8个字节转换为double
  2. 如果访问的是int,就把前4个字节转换为int
  3. char同理。
相关文章