如果我有一个包含指向不同类型数据的指针的联合体,那么通过一个与它被分配的字段不同的字段来释放错误的内存是法律的吗?它甚至符合“公共初始序列”规则吗?
#include <stdlib.h>
typedef struct {
int type;
union {
void *entries;
long *long_entries;
// etc
} u;
} Bar;
int main (void) {
Bar bar;
bar.u.long_entries = malloc(6 * sizeof(long));
free(bar.u.entries);
}
字符串
我倾向于说这是法律的,但我不完全确定。
考虑到目前为止的答案,我认为我必须将我的代码更改为这样的代码;我希望这是完全法律的:
typedef struct {
int type;
void *entries;
} Bar;
int main(int argc, char *argv[]) {
Bar bar;
bar.entries = malloc(6 * sizeof(long));
// ...
long *long_entries = bar.entries;
long_entries[3] = 123;
// ...
free(bar.entries);
}
型
2条答案
按热度按时间vdzxcuhz1#
如果我有一个包含指向不同类型数据的指针的联合体,那么通过一个与它被分配的字段不同的字段来释放错误的内存是法律的吗?它甚至符合“公共初始序列”规则吗?
void
和long
是不兼容的类型,并且可能Foo
与任何一个都不兼容,因此即使将指针 Package 在结构中,公共初始序列规则也不适用。nafvub8i2#
指向不同类型的指针是否符合“公共初始序列”规则?
号
通过与分配给它的字段不同的字段释放错误的内存是法律的吗?
在问题的上下文中,
free(bar.entries)
有效吗?我会说这福尔斯实现依赖。当你读取一个被分配的不同的联合成员时,内存被解释为新的类型。现在,当你将存储
long *
的内存重新解释为void *
时,你会得到一个正确的地址,它将指向同一个long *
,在这种情况下,bar.entries == bar.long_entries
。或者它可能不会发生。或者你可能会得到一个陷阱表示。