联合体union的详解

1.概述

联合体union的定义方式与结构体一样,但是二者有根本区别。

在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。

2.联合体长度

在The C Programming Language里面讲述union内存分配的原话是

1)联合体就是一个结构

2)联合体的所有成员相对于基地址的偏移量为0

3)此结构空间要大到总够容纳最“宽”的成员

4)并且,其对其方式要适合于联合体中所有类型的成员

我的理解可以概括为两点:

1)联合体的结构空间要足够大,要等于最长的一个结构变量的空间,但是这个最长的空间要满足以下条件:

1.要大于等于最长的一个结构变量的空间

2.并且要能够整除其他结构变量的数据长度,即联合体空间对其他成员的元类型要能够整除(int a[5],其元类型为int,元类型长度为4),实际上就是要取一个元类型的最小公倍数。

这儿举例来说

struct   aircraft
{
int   wingspan;
int   passengers;
union
{
float   fuel_load;
float   bomb_load;
int   pallets;
};
}fighter; 

这个结构体中,各个结构变量的空间分别为float   fuel_load; 占4个字节,char a[5];占5个字节,int pallets;占4个字节。通过“3)此结构空间要大到总够容纳最“宽”的成员”这句话,我们可以认为是结构体的空间为5个字节即可,但是“其对其方式要适合于联合体中所有类型的成员”没有满足,对于这个问题,通过上面红色字体部分可以解决。,因此联合体空间为8.8可以整除 4(float、int长度)和1(char的长度),并且8大于数组5.

再举一个例子有助于大家理解。

struct   aircraft
{
int   wingspan;
int   passengers;
union
{
float   fuel_load;
float   bomb_load;
int   pallets;
};
}fighter; 

sizeof(fighter) 是12 。int   wingspan; int   passengers;两个int型 8个字节。union中 3个都是4个字节,因此union长度为4个字节。

3.内存分配

一句话:联合体变量的各个成员都是从低字节开始公用的。即:所有的成员都是从低字节开始的。

我们先为整个union分配一个空间,这个空间大小就是上面(2)内存分配中所讲述的。

union {
      int i;
      char x[2];
}a;
int main(void)
{
   a.x[0] = 10;
   a.x[1] = 1;
   printf("%d\n",a.i);
   return 0;
}

其内存如下图所示。a.x[0] 处于低字节,x[1]高字节。当调用i这个成员变量的时候,其开始地址仍然是从起始地址开始,数4个字节输出。因此为 256 + 10 = 266

程序附上:

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#if 0
typedef union data{
     float a;
     float b;
     int c;
}data_t;
int main(int argc ,char **argv)
{

     printf("sizeof(float):%d\nsizeof(data_t):%d\n",sizeof(float),sizeof(data_t));
     return 0;

}
#endif
typedef union data{
     int i;
     char x[2];
}data_t;
int main(int argc ,char **argv)
{

        data_t datab;
     memset(&datab,0,sizeof(datab));
     datab.x[0] = 10;
     datab.x[1] = 1;

        printf("sizeof(float):%d\nsizeof(int):%d\n",sizeof(float),sizeof(int));
     printf("datab.i :%d\n",datab.i);
     return 0;

}

4.附录 各个数据类型的长度

type bytes

int  4

char 1

short int 2

bool 1

long 4

long long 8

float 4

double 8

long double 8

时间: 2024-08-11 22:34:50

联合体union的详解的相关文章

union联合体使用详解

1.联合体联合体(union)与结构体(struct)有一些相似之处.但两者有本质上的不同.在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和.而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度.应该说 明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值. 一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型. 2.变量声

mysql union 详解

Union:作用:把2次或多次查询结果合并起来要求:两次查询的列数一致推荐:查询的每一列,相对应的列类型也一样 可以来自于多张表 多次sql语句取出的列名可以不一致,此时,以第1个sql的列名为准 例一. select user_name,user_email,msg_content from ecs_feedback where msg_status = 1 union select user_name,email,content from ecs_comment where status =

共用体union详解

一共用体的概念 当需要把不同类型的变量存放到同一段内存单元或对同一段内存单元的数据按不同类型处理则 需要使用共用体数据结构 例把一个整型变量一个字符型变量一个实型变量放在同一个地址开始的内存单元中 共用体的定义形式 union 共用体名 成员列表 变量列表 注意区分 共用体各成员占相同的起始地址所占内存长度等于最长的成员所占内存 结构体各成员占不同的地址所占内存长度等于全部成员所占内存之和 二共用体变量的引用 只能引用共用体变量的成员如 union data a; a.i; a.ch; a.f;

详解大端模式和小端模式

详解大端模式和小端模式 原文地址:http://blog.csdn.net/ce123_zhouwei/article/details/6971544 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战.战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,

《招一个靠谱的移动开发》iOS面试题及详解(上篇)

多线程.特别是NSOperation 和 GCD 的内部原理. 运行时机制的原理和运用场景. SDWebImage的原理.实现机制.如何解决TableView卡的问题. block和代理的,通知的区别.block的用法需要注意些什么. strong,weak,retain,assign,copy nomatic 等的区别. 设计模式,mvc,单利,工厂,代理等的应用场景. 单利的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 响应值链. NSTi

Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度(八)

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的创建 参照 分析Linux内核创建一个新进程的过程 前言 Unix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(确切说vfork创造出来的是轻量级进程,也叫线程,是共享资源的进程)

PE文件结构详解(四)PE导入表

PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPORT,即导入表. 也许大家注意到过,在IMAGE_DATA_DIRECTORY中,有几项的名字都和导入表有关系,其中包括:IMAGE_DIRECTORY_ENTRY_IMPORT,IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,IMAGE_DIRECTORY_ENTRY_IAT

MDK常见错误详解集合

错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identifier 未定义的标识符 error 4: Duplicate identifier 重复定义的标识符 error 5: Syntax error 语法错误 error 6: Error in real constant 实型常量错误 error 7: Error in integer consta

php调用C代码的方法详解和zend_parse_parameters函数详解

http://blog.csdn.net/super_ufo/article/details/3863731 php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方法是用system调用,把现有C代码写成一个独立的程序.参数通过命令行或者标准输入传入,结果从标准输出读出.其次,稍麻烦一点的方法是C代码写成一个daemon,php程序用socket来和它进行