【C语言】关键字 union

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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值