【发布时间】:2018-08-29 07:53:05
【问题描述】:
简化示例:
typedef union {
int foo;
char* bar;
} int_or_str;
void baz() {
int_or_str* bogus = malloc(sizeof(int_or_str) * 43);
bogus[42].bar = "test";
printf("%s\n", bogus[42].bar);
}
- 如果这项工作,编译器会假定
bogus的所有42 个成员都是char 指针吗? (显然,我可以试试这个,但要强调“应该”)。 - 它是否定义了当您以这种方式访问联合数组时会发生什么?
- 假设,我想要一个实际上持有不同大小值的联合数组,这合法吗? (如果我确定联合成员在内存中的布局方式,我可以单独存储布局并计算偏移量)。
如果您想知道这个问题的动机:基本上,我正在尝试为运行时定义的结构提出解决方案。我的想法是有一个联合数组来表示结构字段,以及一些记录如何访问这些字段的元数据。
【问题讨论】:
-
那应该是
int_or_str* bogus = malloc(sizeof(int_or_str) * 43); -
这看起来有点像 XY 问题。目前尚不清楚您所说的 3 和最后一段是什么意思。请扩展它们。您的示例在某些情况下“有效”,但我担心您可能会从中得出错误的结论。
-
@PaulOgilvie 已修复,我在这里输入了示例,所以,抱歉有错别字。
-
@SanderDeDycker 是的,这可行,但它会浪费标签上的内存,而且,就我而言,通常我可以提前知道所有工会成员都将在同一时间。