struct和union的区别

当初学习C语言时并没有特别注意 union 的用法,也不知道与 struc t相比有何不同。经过网上的一番搜索,现在总算是恍然大悟,所以就小结一下。如有错误之处,敬请指正。( struct 和 union 的结构定义形式没有多大差别,只要不是初学者,相信大家不会在这方面存在什么问题。)

struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

struct sTest

{

int a;  //sizeof(int) = 4

char b;  //sizeof(char) = 1

shot c; //sizeof(shot) = 2

}x;

所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式,可以参考转载的《 struct 字节对齐分析》,介绍的还是不错的。

union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给 union 的内存 size 由类型最大的元素 size 来确定,如下的内存就为一个 double 类型 size :

union uTest

{

int a;   //sizeof(int) = 4

double b;  //sizeof(double) = 8

char c;  //sizeof(char) = 1

}x;

所以分配的内存 size 就是8 byte。

既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:

x.a = 3; x.b = 4.5; x.c = ‘A’;

这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。

说到这里,大家应该已经明白两者最关键的区别了吧,无非就在于内存单元的分配和使用。然而要灵活地使用 struct 和 union 还是存在许多小技巧的,比如:元素的相关性不强时,完全是可以使用 union ,从而节省内存size; struct 和 union 还可以相互嵌套。

时间: 2025-01-07 17:03:40

struct和union的区别的相关文章

2015-10-20 关于struct和union

1.结构体: 1.1.思考题:空结构体占用多大内存空间? ANS:不同的编译器,这个结果是不定的.在GCC下,空结构体占用0个字节的空间.在G++编译器下,空结构体占用1个字节的空间. 1.2.一个新的概念----柔性数组 柔性数组:数组大小待定的数组. C语言中结构体的最后一个元素可以为一个大小未知的数组.于是可以利用该特性来产生柔性数组: struct _soft_array { int len; int array[]; }; 此处有一个问题是需要注意的:sizeof(_soft_arra

<转> Struct 和 Union区别 以及 对内存对齐方式的说明

转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息. 2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在. 3.对于Union的不同成

struct、union、enum

struct 1.结构体和数组的区别:可以再结构体里声明数组:结构体变量可以相互赋值,而数组不行. 2.struct与class的区别:class的成员访问权限默认是private,而struct成员的是public. 3.结构体的定义: (1)可递归.结构体内部可以使用指针指向自己.例如,链表. (2)可嵌套.结构体内部可以包含其他的结构体. 4.结构体中的位域. 在存储信息时,不需要占用一个完整的字节,而只需要占几个或一个二进制位. union 结构体和共用体都是由多个不同类型的数据类型成员

.NET中struct与class的区别

在.net中的struct与class有很多相似之处,比如可以直接new,对于成员可以直接XX.field,以至于有不少程序员在用时,将其混在一起,分不清有何区别.这两者有何区别呢? 1.类型不同 我们先来看一段代码 static void Main(string[] args) { TypeDemo(); Console.ReadLine(); } // Reference type (because of 'class') class SomeClassRef { public Int32

Struct和Class的区别

C#的struct结构具有以下特点: 数据类型:结构是值类型,而类是引用类型.数据类型:向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的.实例化:与类不同,结构的实例化可以不使用 new 运算符(未验证). 位置:结构可以写到class中,与方法并列:也可以写在class外,与类并列.构造函数:结构可以声明有参数的构造函数,但它们必须给所有的属性赋值(this.x=xx;this.y=yy;...). 若声明无参的构造函数,编译期间报错:编译器错误消息: CS0568: 结构不能

c#中struct和class的区别

简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单.本篇主要包括: ■ 概括来讲■ 从赋值的角度体验struct和class的不同■ 从参数传值角度体验struct和class的不同■ 从struct类型的struct类型属性和struct引用类型属性体验struct和class的不同■ 从构造函数体验struct和class的不同■ 从给类型成员赋初值体验s

oracle中union和union all区别与性能分析

[ 概要 ] 经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并, 那么二者有什么区别呢? 下面我们就简单的分析下. [ 比较 ] union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序; union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复; 下面我们举一个简单的例子来证明上面的结论: 1. 准备数据: drop table

C#详解struct和class的区别

简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单. 概括来讲,struct和class的不同体现在: ● class是引用类型,struct是值类型,所有他有值类型和引用类型的区别特征,参见<C#值类型和引用类型的区别> ● class的实例创建是在托管堆上,struct实例创建是在栈上 ● class实例的赋值,赋的是引用地址,struct实例的赋值,赋

struct与union

1. union的长度 union { int k; int p[4]; double q; }data; sizeof(data)=20; //结构体中最大的数据长度 2.struct的长度 struct { int k; double q; }data; sizeof(data)=16; //结构体中最大的数据长度的倍数(默认情况,如果设置了不同的内存对齐另当别论): //如果以1字节.4字节对齐的话,sizeof(data)=12: 3.struct与union的联合使用 void str