如何将联合值写入C中的数组元素?

时间:2015-07-22 09:35:46

标签: c arrays data-structures unions

我有这样的工会 -

union
{
  int a : 1 ;
  int b : 1 ;
  int c : 1 ;
} Byte1;

我对工会成员写的是TRUE或FALSE。

Byte1.a = x>0;
Byte1.b = y>0;
Byte1.c = z>0;

我需要写入数组元素的联合的全部内容

int array[8];
array[7] = Byte1;

但是这会引发错误 - 在分配类型' int'时会出现不兼容的类型。来自类型' union'

如何在C中为数组元素指定u​​nion?

3 个答案:

答案 0 :(得分:0)

正如你所说

  

union的全部内容我需要写入数组元素int   array [7] = Byte1;

但是您可以定义具有许多成员的联合,但在任何给定时间只能有一个成员包含值。所以整个包含是不可能存储的。在数组中只存储一个必需值。或者你可以这样做

array[7] = Byte1.a;

答案 1 :(得分:0)

知道您的union只能保存int值(4字节),您可以使用memcpy将数据从Byte1复制到您的数组中,如下所示:

memcpy(array+7, &Byte1, sizeof(Byte1)); // copies the first 4 Bytes of Byte1 to array[7] 

并且不要忘记包含string.h

#include <string.h>

答案 2 :(得分:0)

虽然将 int -sized union 复制到 int ,但您可能确实使用memcpy()作为其他人提到的,但目前还不清楚你想要实现的目标。

让我试着用英语描述你的所作所为:

  1. 拥有4字节(或8字节,取决于架构)存储。
  2. 给它四个不同的名称(即a,b,c,d因为 union 关键字而引用相同的存储空间)。
  3. 多次根据某些条件修改该存储的最低有效位,每次下次覆盖以前的值。
  4. 将存储空间中的最后一个结果复制到其他存储空间
  5. 以下代码产生的效果相同,效果更少:

    int Byte_that_is_actually_a_word;
    ...
    Byte_that_is_actually_a_word = (z > 0);
    ...
    int array[8];
    array[7] = Byte_that_is_actually_a_word;
    

    如果您希望将3个不同的布尔值存储在结果array的单个元素中,那么您应该这样做:

    union {
        struct {
           unsigned int flag_x:1,
                        flag_y:1,
                        flag_z:1;
        };
        unsigned int all;
    } bitmask;
    
    ...
    
    bitmask.flag_x = (x > 0);
    bitmask.flag_y = (y > 0);
    bitmask.flag_z = (z > 0);
    
    ...
    
    array[7] = bitmask.all;