c - 是否可以动态选择 UNION 下的 2 个结构之一?

标签 c

这个问题是关于C语言概念的。

现有结构:

struct parent{
    char c[4];
    float f;
    double d;
    int flag;

    struct child_old
    {
        int i;
        float l;
    }c1;
}

我想在父级下添加一个新结构(我们称之为 - child_new)。 根据场景,我一次仅使用一个子结构。不能同时两者。 所以我可以将它们放在 UNION 下。

修改后的结构:

struct parent{
    char c[4];
    float f;
    double d;
    int flag;

    union{
        struct child_old
        {
            int i;
            float j;
        }c1;

        struct child_new
        {
            int i;
            float j;
            char c[32];
            double d;

        }c2;
    }UU;
}

这里我的要求是,根据结构成员“标志”值(0/1),我需要决定需要使用哪个子结构。

这是因为:

  1. 我的父结构类型文件系统中存储着大量数据。阅读时应该不会有任何问题。
  2. 使用 child_old 时,我不想消耗 child_new 所需的额外空间。

用C语言可以吗? 或者有什么解决方案吗?

最佳答案

您所写的内容很好,您可以使用以下内容来使用它:

switch(p.flag) {
   case CHILD_OLD:
       // work with p.c1
       break;
   case CHILD_NEW:
       // work with p.c2
       break;
} 

但是,您的完整结构对于 union 体中最大的成员来说始终足够大。因此,当您使用 c1 时,您仍然有足够的空间分配给 c2。但是,至少您不会每次都分配 sizeof(c1) + sizeof(c2)

如果您确实想根据每个记录使用的变体分配更多或更少的空间,则需要在结构中放置一个指针,并为子元素动态分配单独的记录。


所有这些确实意味着,如果您从磁盘读取字节数组,然后将它们转换为结构:

  parent *p = (parent*) addressOfSomeDataReadFromAFile;

(不是一个好主意,但在野外并不罕见)

...那么使用 union 技术扩展parent结构通常不会起作用。您现有的文件将用比新结构更少的字节来表示记录。

关于c - 是否可以动态选择 UNION 下的 2 个结构之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185910/

相关文章:

python - 如何将其从Python转换为C?

c - 变量 'tireshine' 在未启动的情况下被使用。 C语言

c - 多个线程( worker )执行不同的功能

c - 如何使用 Atmel Studio 中的调试器来使用 scanf?

c - Printf 的变体及其原型(prototype)理解

c++ - 如何将 minizip 包装器转换为 unicode?

c++ - 节点代码或算法的通用树父

c - X86-64 NASM 调用 extern c 函数

c - LynxOS strtod 与 Linux 不同

求给定N个数的最小公倍数的C++程序