这个问题是关于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),我需要决定需要使用哪个子结构。
这是因为:
- 我的父结构类型文件系统中存储着大量数据。阅读时应该不会有任何问题。
- 使用 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/