指向不同类型的指针是否符合“共同初始序列”规则?

问题描述 投票:0回答:1

如果我有一个包含指向不同类型数据的指针的联合,通过与分配的字段不同的字段释放分配的内存是否合法?它是否符合“共同初始序列”规则?

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);

我倾向于说这是合法的,但我不完全确定。

c unions
1个回答
0
投票

如果我有一个包含指向不同类型数据的指针的联合,通过与分配的字段不同的字段释放分配的内存是否合法?它是否符合“共同初始序列”规则?

  • 您所描述的内容不满足“共同初始序列”规则的标准,因为这是关于具有结构类型的联合成员。指针不是结构。

  • 即使我们谈论的是包含指针作为成员的结构,如果指向不同类型的指针所指向的类型不兼容,那么它们也是不兼容的。

    void
    long
    不是兼容类型,而且
    Foo
    可能与任何一个都不兼容,因此即使将指针包装在结构中,通用初始序列规则也不会适用。

  • 在 C 中,您不需要依赖公共初始序列规则来读取与上次写入不同的联合成员。实际上,实现对所有对象指针类型使用相同的表示形式是很常见的,并且在这样的实现上,您确实可以使用任何这些指针成员来释放指向的数据。然而,C 并不要求所有对象指针类型使用相同的表示形式,而且历史上也有一些实现没有这样做。其中之一,您描述的做法很可能不会可靠地按照您的预期运行。这样的代码可以符合语言规范,但它并不严格地。它不便于携带。

© www.soinside.com 2019 - 2024. All rights reserved.