在c中将值存储在union中

时间:2011-06-30 17:58:02

标签: c

如果我们有三个变量int i的联合,char c,float f;我们现在在变量c中存储一个值。并且我们忘记了在一段时间之后,当前拥有值的联合变量是什么。因为这是语言提供的任何机制,我们可以使用它来确定它是i还是c或f当前是否有值。

6 个答案:

答案 0 :(得分:3)

好吧,联盟的重点是所有都会保存一个值。但是,如果你提取的类型不同于你输入的类型,那么你读取的值可能没有意义。

如果您打算提取相同的类型,则必须跟踪自己输入的类型。没有语言功能可以跟踪您的情况。

答案 1 :(得分:3)

这是不可能的。联合的不同成员都指向相同的内存地址,它们只是不同的方式来查看该内存。修改联盟成员会修改所有其他成员。你无法区分彼此。

答案 2 :(得分:3)

#define VARIANT_FLOAT_TYPE 1
#define VARIANT_DOUBLE_TYPE 2
// and so on

struct variant_wb {
    union {
        float f;
        double d;
        int i;
        char c;
    };
    int stored_type;
};

然后你可以像这样使用它:

struct variant_wb var;
var.f = 1.23;
var.stored_type = VARIANT_FLOAT_TYPE;

你也可以使用无数函数来处理这个struct / union,或者你可以学习C ++并“正确”地执行它,因为该语言具有这种类型的特性。我的C ++不是很好,也许一些大师可以用C ++方式展示如何做类似的解决方案。

答案 3 :(得分:2)

在C ++ / Qt / COM / DCOM中有一个“Variant”的概念,它粗略地说是一个联合体,它也存储了如何访问联合。 在C中,你必须提供这样的东西:

struct myCVariant
{
  int variantType;
  union 
  {
    char  v1;
    int   v2;
    float v3;
  } variantContent;

  void initVariant() 
  {
    variantType = 0;
  }

  void setChar(char a) 
  {
    variantType = 1;
    variantContent.v1 = a;
  }

  void setInt(int a)
  {
    variantType = 2;
    variantContent.v2 = a; 
  }

  // ... and so on

  bool getChar(char* pa)
  {
    if (variantType == 1)
    {
      *pa = variantContent.v1;
      return true;
    }

    return false; // Error reading a char where something else was stored
  }

  // ... and so on
}; 

您可以在某些C ++源代码中复制一些Variant实现并将其移植到C.它不完全相同,但它类似。它有些类型安全(至少在运行时)。

编辑:hexa击败了我一秒钟。请注意,我没有编译它,所以我的代码可能包含拼写错误。

答案 4 :(得分:1)

没有

C是一种低级语言。它允许你写任何你想要的原始内存。最后,无论是包含文本,整数还是代码,所有内存都包含位。没有真正的方法来确定这些位代表什么。

虽然所有工会成员都“持有价值”,但没有机制来确定它最初的数据类型。

如果您需要知道这一点,那么您应该存储一个指示数据类型的标志,或者您不应该使用联合。

答案 5 :(得分:1)

如果你忘记了就可以了,因为它会直接写在代码上,你可以阅读它来查找。