如果我有一个包含指向不同类型数据的指针的联合,通过与分配的字段不同的字段释放分配的内存是否合法?它是否符合“共同初始序列”规则?
typedef struct {
int type;
union {
void *entries;
long *long_entries;
Foo *foo_entries;
// etc
}
} Bar;
Bar bar;
bar.long_entries = malloc(6 * sizeof(long));
...
free(bar.entries);
我倾向于说这是合法的,但我不完全确定。
如果我有一个包含指向不同类型数据的指针的联合,通过与分配的字段不同的字段释放分配的内存是否合法?它是否符合“共同初始序列”规则?
您所描述的内容不满足“共同初始序列”规则的标准,因为这是关于具有结构类型的联合成员。指针不是结构。
即使我们谈论的是包含指针作为成员的结构,如果指向不同类型的指针所指向的类型不兼容,那么它们也是不兼容的。
void
和 long
不是兼容类型,而且 Foo
可能与任何一个都不兼容,因此即使将指针包装在结构中,通用初始序列规则也不会适用。
在 C 中,您不需要依赖公共初始序列规则来读取与上次写入不同的联合成员。实际上,实现对所有对象指针类型使用相同的表示形式是很常见的,并且在这样的实现上,您确实可以使用任何这些指针成员来释放指向的数据。然而,C 并不要求所有对象指针类型使用相同的表示形式,而且历史上也有一些实现没有这样做。其中之一,您描述的做法很可能不会可靠地按照您的预期运行。这样的代码可以符合语言规范,但它并不严格地。它不便于携带。