在分配特定的成员后访问工会成员

时间:2013-05-23 21:06:21

标签: unions

我知道union的大小是其最大成员的大小。我无法推断它是如何表现的。 考虑一下情况

union x
{
    int a;
    char b;
    short int c;
}obj;
   int main()
   {
        obj.a=3;
        printf("%d %c %d",obj.a,obj.b,obj.c);
   }

输出是什么以及如何生成? 提前致谢

1 个答案:

答案 0 :(得分:1)

您的联盟没有名为x的成员,因此假设您为其中一个成员分配值,其余成员将获取该值的一部分。例如:

union x
{
    long  longval;
    char  charvals[4];
    short shortvals[2];
    char  oneCharVal;
    short oneShortVal;
} obj;

obj.longval = 0x12fe6497;
printf( "c1: %x, c2: %x, c3: %x, c4: %x\n", obj.charvals[0], obj.charvals[1], obj.charvals[2], obj.charvals[3] );
printf( "s1: %x, s2: %x\n", obj.shortvals[0], obj.shortvals[1] );
printf( "oneCharVal: %x\n", obj.oneCharVal );
printf( "oneShortVal: %x\n", obj.oneShortVal );

将打印:

c1: 97, c2: 64, c3: fe, c4: 12
s1: 6497, s2: 12fe
oneCharVal: 97
oneShortVal: 6497

为了清楚起见,我故意忽略了标志。 %x打印一个int,通常是32位,所以它会在打印前将chars和short转换成long并实际打印:

c1: ffffff97, c2: 64, c3: fffffffe, c4: 12
s1: 6497, s2: 12fe
oneCharVal: ffffff97
oneShortVal: 6497

要按照我最初展示的方式打印数字,您需要更改printf格式,如下所示:

printf( "c1: %hhx, c2: %hhx, c3: %hhx, c4: %hhx\n", obj.charvals[0], obj.charvals[1], obj.charvals[2], obj.charvals[3] );
printf( "s1: %hx, s2: %hx\n", obj.shortvals[0], obj.shortvals[1] );
printf( "oneCharVal: %hhx\n", obj.oneCharVal );
printf( "oneShortVal: %hx\n", obj.oneShortVal );

我在这个例子中使用十六进制数字来清楚地说明数字是如何分开的,因为每两位数字是一个字节(8位)

现在这也非常依赖于处理器的内部性。这个例子基于很少的endien,就像intel处理器一样。大型内部处理器会扭转这些数字。

如果要为一个小于完整联合大小的成员分配一个值,那么如果以前从未使用过该实例,那么剩余的空间是未定义的,并且如果它之前将包含其余的内容。以前用过的。编译器只写入您正在写入的成员占用的内存部分,并屏蔽其余部分,以免打扰它。以下代码:

printf( "\n" );
printf( "%x\n", obj.longval );
obj.charvals[2] = 0x193;
printf( "%x\n", obj.longval );

产生以下结果:

12fe6497
12936497

请注意,不是写0x193,而是只写0x93而其余数据保持不变。