【问题标题】:Working with a union of structs in C在 C 中使用结构的联合
【发布时间】:2013-12-23 23:06:19
【问题描述】:

假设我有以下类型:

typedef struct TYPEA
{
    int type;
    char[12] id;
} TYPEA;

typedef struct TYPEB
{
    int type;
    int value;
} TYPEB;

我想使用创建这些类型和“int”的联合,这样我就可以访问“类型”int,而无需知道联合中存储的是 TYPEA 还是 TYPEB(int 的值让我确定哪个实际上存储在那里)。虽然我无法获得正确的语法。

我的工会:

typedef union MEMBER
{
    int type;
    struct TYPEA a;
    struct TYPEB b;
} MEMBER;

通过以下方式访问联合:

typedef struct WRAPPER
{
    union MEMBER* member;
    struct WRAPPER* next;
} WRAPPER;

问题:

  1. (使用 'w' 作为指向已分配 WRAPPER 结构的指针)使用 w->member->a.id 访问会给出“对成员 'id' 的请求,而不是结构或联合。
  2. 我可以将一个指向已经 malloc 的 TYPEA/B 的指针直接分配给 w-> 成员吗?还是需要特别分配联合?

谢谢。

【问题讨论】:

  • w->member 仍然是一个指针。你不能在上面使用. 运算符。
  • member 是一个指针,那么为什么你认为你可以在没有指针取消引用 (->) 的情况下访问类型?
  • 缺少一些;,所以出现了。
  • 抱歉,问题 1 的意思是:w->member->a.id,而不是 w->member->type。我假设这是因为联合不是指针。我已经编辑了问题。

标签: c unions


【解决方案1】:
  1. 使用w->member->type
  2. 您需要专门分配union

可能会引起误解的一点是union 持有int,或TYPEA,或TYPEB,因此特别是您不能依赖联合中的int type;告诉你工会持有哪个struct

编辑以回答 cmets 中的问题:

你可能想要这样的东西:

struct TYPEA {
  char data[30]; // or whatever
};

struct TYPEB {
  double x, y; // or whatever
};

struct some_info {
  int type; // set accordingly
  union {
    struct TYPEA a;
    struct TYPEB b;
  } data; // access with some_info_object.data.a or some_info_object.data.b
};

【讨论】:

  • 因此,即使 TYPEA 和 TYPEB 结构在第一个位置有一个 int,如果不知道我正在使用哪种类型,就无法访​​问它?
  • 在 malloc 后 TYPEATYPEB 是否需要 malloc struct some_info
【解决方案2】:
  1. 您将member 字段定义为指针,因此您应该使用 w->member->type 而不是 w->member.type
  2. 你应该malloc联合类型。分配联合时,您将获得一个结构,其 sizeof 等于联合中的最大元素。如果您尝试将结构复制到联合指针中,则会弄乱对齐方式。

【讨论】:

    【解决方案3】:

    w->member.type 应该是w->member->type,因为w->member 是一个指针。

    我不知道 C 是否会让您将 TYPEA*TYPEB* 分配给 MEMBER* - 不知何故我对此表示怀疑。你总是可以(MEMBER*) 它,但我会考虑重新组合structs 以删除int 标签,而是声明一个包含标签的structTYPEATYPEBunionstructs 理想情况下不需要担心他们在 union 中的事实。

    【讨论】:

      【解决方案4】:

      您可能想查看我的问题中的代码:

      Union of structs with common first member

      基本上,我做你想做的,但我使用的是这两种类型共有的内部结构(示例中为contained)。然后可以强制转换此结构以访问两种类型的公共元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2012-07-13
        • 1970-01-01
        相关资源
        最近更新 更多