C语言关键字之union

是什么呢

union 在C语言中可以被称为联合体,也有将其称为共用体。它是一种自定义类型,可以使用它来创建变量。

使用格式

union 联合体名称 {
变量 1;
变量 2;

变量 n;
};

如何理解

开辟空间大小是 变量列表中最大的变量所占的空间,足以容纳你变量列表中最大的那个值。

例1:

struct demo {int num1;int num2;
};

首先,先看不使用union的这段代码所开辟的空间是两个 int 的大小,可存储 num1 和 num2,如下图

union struct demo {int num1;int num2;
};

再来看,使用union的这段代码所开辟的空间是一个 int 的大小,要么存储 num1 要么存储 num2,如下图

例2:

struct demo {int num1;long num2;
};

首先,先看不使用union的这段代码所开辟的空间是一个 int + 一个 long 的大小,如下图

union struct demo {int num1;int num2;
};

再来看,使用union的这段代码所开辟的空间是 num1 和 num2 中占内存最大的一个 也就是一个 long 的大小,如下图

使用场景

例如,在 Linux 内核中的这段代码

union task_union {struct task_struct task;char stack[PAGE_SIZE];
};

这段代码使用 union 定义了 task_union,相当于在内存中开辟了 两个变量列表中最大的空间。stack 占用的空间大小是 一页的空间,也就是 4kb 的大小,而 task 的大小肯定是小于 4kb 的,所以这个 task_union 肯定是仅开辟了 4kb 的空间,换句话说就是巧用了 union 在占中存储了 task 。

上面例子的两个补充代码:
PAGE_SIZE的宏定义如下:

#define PAGE_SIZE 4096

task_struct 的结构体如下:

struct task_struct {/* these are hardcoded - don't touch */long state; /* -1 unrunnable, 0 runnable, >0 stopped */long counter;long priority;long signal;struct sigaction sigaction[32];long blocked;   /* bitmap of masked signals */
/* various fields */int exit_code;unsigned long start_code,end_code,end_data,brk,start_stack;long pid,father,pgrp,session,leader;unsigned short uid,euid,suid;unsigned short gid,egid,sgid;long alarm;long utime,stime,cutime,cstime,start_time;unsigned short used_math;
/* file system info */int tty;      /* -1 if no tty, so it must be signed */unsigned short umask;struct m_inode * pwd;struct m_inode * root;struct m_inode * executable;unsigned long close_on_exec;struct file * filp[NR_OPEN];
/* ldt for this task 0 - zero 1 - cs 2 - ds&ss */struct desc_struct ldt[3];
/* tss for this task */struct tss_struct tss;
};

C语言关键字之union相关推荐

  1. C语言学习—联合体Union和关键字Typedef

    C语言学习-联合体Union和关键字Typedef 前言 1 联合体Union 1.1 Union认知 1.2 Union应用 2 关键字typedef 前言 内容主要为联合体Union和关键字Typ ...

  2. c语言 char转int_C语言关键字及进制的转换你都知道吗?

    ​前面我们讲过 C语言简洁.紧凑 使用方便.灵活 那是什么使得C语言这么方便呢? 那就是关键字,或称保留字 C语言的关键字共有32个 根据关键字的作用 可分为 数据类型关键字 控制语句关键字 存储类型 ...

  3. c语言字母表关键字,读书笔记-C语言关键字

    001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内 ...

  4. c语言getchar用法_C语言 — 关键字

    几十个关键字不多,用得多了自然会记住,相信大家也不会担心.下面是C语言中的 32 个关键字: 一丶C语言关键字 第一个关键字:auto 用来声明自动变量.可以显式的声明变量为自动变量.只要不是声明在所 ...

  5. 根据作用C语言关键字分为,C语言 关键字

    关键字就是已被C语言本身使用,不能作其它用途使用的字.例如关键字不能用作变量名.函数名等 由ANSI标准定义的C语言关键字共32个. 根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两 ...

  6. 由ANSI标准定义的C语言关键字,C语言32个关键字详解

    C语言中32个关键字详解 由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register ...

  7. C语言中文字符索引,C语言关键字中英文对照索引

    C语言关键字中英文对照索引 一. C语言关键字对照 关键字,又称保留字,是C语言中已预先定义.具有特定含义的标识符. 注:C语言中共有32个关键字,所有关键字都用小写字母表示,且这些关键字不能用作用户 ...

  8. 【译】volatile C语言关键字,如何使用?

    原文 概要 许多程序员无法正确的理解C语言关键字volatile.这并不奇怪,大多数C原因书籍不过一两句一带而过.本文将告诉你如何正确使用它. 在C/C++嵌入式代码中,你是否经历过下面的情况: 代码 ...

  9. c语言关键字大全(32个)

    C 语言可以像汇编语言一样对位.字节和地址进行操作,而这三者是计算机最基本的工作单元.以下是店铺为大家整理的c语言关键字大全,欢迎阅读 1.auto :声明自动变量 2.break:跳出当前循环 3. ...

最新文章

  1. R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)、使用ggplot2可视化条形图(bar plot)、并在条形图上添加百分比标签
  2. No.3 clojure 调用 Java
  3. [iOS]MVVM-框架介绍
  4. 【LeetCode】130.被围绕的区域
  5. 计算某天是星期几的方法
  6. sql2005备份还原详解
  7. ETHREAD APC 《寒江独钓》内核学习笔记(4)
  8. 程序员是如何一步一步被诈骗的?《原力计划-打卡挑战》第二周周榜揭晓
  9. IOS不支持2017-09-09的日期格式
  10. Kicad安装与配置_Windows
  11. IAR软件ZigBee物联网
  12. 安川ga700变频器故障码集_安川变频器故障代码
  13. 情怀java手机网游_Java开发游戏马里奥,就要码出我们这一代人的情怀
  14. <论文阅读> M2BEV Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Represen
  15. 从Waterfall到Bidding,开发者离Open Bidding还有多远
  16. python作排产计划表_排产计划表
  17. Excel if函数用法
  18. Install Mercury MW150US WIFI dongle on RPi
  19. 杭州市初级工程师职称评审条件
  20. 饿了么UI图片上传的实现

热门文章

  1. 织梦调用图集第一个图片地址
  2. 2.4 C语言入职例程一:空心菱形输出
  3. 使用turtle库绘制分形树、太阳花、五角星
  4. 那些厚黑又细腻的人性社交设计
  5. iapp启动图代码_GTA5新的R*启动器出现问题之应对方法
  6. MT6763 N1 防误触模式的实现
  7. 错误RuntimeWarning: Glyph xxxxx missing from current font的产生原因解析,检测当前字体是否包含某字符
  8. mysql max()函数和min函数
  9. MySQL 中 int 最大值
  10. 快速创建精彩的Flash游戏 (二) Flash3D游戏引擎简介