我正在尝试在Linux环境中理解并使用C中的union
。
假设我有以下联合
union test {
int one;
long two;
} t1;
如果我要将t1.one
写入网络文件描述符(socket fd),那么当union选择最大元素时,会将额外的零写入fd,这是两个;结构联合可能会变得更糟。有人可以告诉我如何克服这个问题吗?
答案 0 :(得分:1)
如果我要将test.one写入网络fd,则会将额外的零写入fd
虽然写入额外字节是正确的,但这些字节的内容不一定都是零:它是未定义的。通常,读取属于联合的字节超出了您通过其他字段写入某些数据的区域是未定义的行为。如果要控制写入的数据量,则需要提供要写出的特定类型。
答案 1 :(得分:1)
不,如果您将test.one
写入网络fd,您将准确写出sizeof (int)
个字节。 test.one
是int
个对象;事实上它恰好是一个工会的成员是无关紧要的,只要你不作为一个整体访问工会。
如果你写完整个联盟,那么当然你会写出联合的完整大小,其至少其最大成员的大小。
所以不要这样做。
跟踪联盟的哪个成员是最新的(即,您最近为哪个成员分配了值),并且只使用该成员。
然后,考虑到你给我们的最少信息,根本不清楚使用联盟是否有意义。
答案 2 :(得分:1)
union
具有最大元素的大小(在本例中为long
),而不是结构。通过更改one
,您将覆盖长的前32位(在32位OS 16上),通过更改two
,将覆盖整个空间并丢失one
。
union test
:- 64 bit +
│ union test │
├──────────────────┤
│ long │
├─────────┬────────┘
│ int |
└─────────┘
64位操作系统上的struct test
:- 96 bit +
│ struct test │
├──────────────────┬─────────┤
│ long │ int │
└──────────────────┴─────────┘