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字节保持不变。 最后,它也同样可以嵌套。 至于访问的时候的变化,只需要明确,访问的都是对应大小的内存单元。 因此,不管谁改,都是该内存,至于值 如果访问的是double,就是把这8个字节转换为double如果访问的是int,就把前4个字节转换为intchar同理。
相关文章
C/C++开发最新文章 C语言学习笔记-2021-03-22 7-10 公路村村通 (30 分)(C语言) LeetCode刷题笔记(简单)---有多少小于当前数字的数字(C语言) C语言试题 C语言 双向链表处理大数加减 C语言涉猎笔记(二) C语言关键字 C语言常见的代码题 C语言中static 试题 c语言:找1000中的“完数” C语言题目:4 4-9输出等级分(用switch语言实现) (10 分) C语言 查询ASCII码 热门教程 HTML/CSS教程JAVASCRIPT教程PHP教程JAVA教程ASP.NET教程Python教程Go教程Ruby教程C教程C++教程
© 2023-2024 沃梦达编程网 版权所有并保留所有权 ICP备案号:粤ICP备14083021号 SiteMap 本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!