Union的使用
首先,long long ago之前还是一个刚刚学习c语言的小萌新的时候就已经接触过Union这个关键字了。
为什么现在又把这个东西捡起来了呢?
最近在看CsApp,看到了这一题:
答案如下面所示:
答:
A:
e1.p的偏移量等于0
e1.y的偏移量等于8
e2.x的偏移量等于0
e2.next的偏移量等于8
B:
16bytes
C:
void proc(union ele *up)
{
up->x = *(up->e2.next->e1.p) - up->e2.next->e1.y;
}
首先关注的是偏移量的地方。为什么Union在内存中的存储格式(各成员变量的偏移量)是这样的呢?
好像是像下面这样的:
在结构(struct)中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。
而在“联合”(Union)中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。每次对于union当中的任意一个成员赋值的时候,都会覆盖这段共享空间之前所有的值。
看一下下面的这段代码就能很清楚了:
#include <stdio.h> void main() { union number { /*定义一个联合*/ int i; struct { /*在联合中定义一个结构*/ char first; char second; }half; }num; num.i=0x4241; /*联合成员赋值*/ printf("%c%c\n", num.half.first, num.half.second); num.half.first='a'; /*联合中结构成员赋值*/ num.half.second='b'; printf("%x\n", num.i); getchar(); } 输出结果为: AB 6261
这段代码讲的很明白了。
所以不难明白原题第一题,第二题是怎么回事。
还有一个问题,第三题,如何确定访问的是union内部的e1还是e2呢?
暂时不清楚,最终的结果是*up=(((up+8)))-((up+8)+8)
那么只能是访问没有歧义的那个了,需要作为地址访问的时候访问的就是指针(刚好在这道题目的设计当中,前后两个struct,数值和指针错位开来了)