Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构错误中的并集_C_Struct_Unions - Fatal编程技术网

C 结构错误中的并集

C 结构错误中的并集,c,struct,unions,C,Struct,Unions,我有以下结构: struct type1 { struct type2 *node; union element { struct type3 *e; int val; }; }; 初始化指向type1实例的指针*f并执行以下操作时: f.element->e甚至只是f.element,我得到: error: request for member ‘element’ in something not a structure or unio

我有以下结构:

struct type1 {
    struct type2 *node;
    union element {
        struct type3 *e;
        int val;
    };
};
初始化指向
type1
实例的指针
*f
并执行以下操作时:
f.element->e
甚至只是
f.element
,我得到:

error: request for member ‘element’ in something not a structure or union

我在这里监督什么?

如果f是指针,那么您可以使用f->element或(*f).element访问“element”

更新:刚刚看到“element”是联合名称,而不是结构的成员。 你可以试试

union element {
    struct type3 *e;
    int val;
} element;
所以最后的结构是这样的:

struct type1 {
    struct type2 *node;
    union element {
        struct type3 *e;
        int val;
    } element;
};
现在您可以通过type1*f访问如下元素成员:

struct type1 *f;

// assign f somewhere

f->element.val;

element
是工会的名称,而不是
type1
成员的名称。您必须为联合元素指定一个名称:

struct type1 {
struct type2 *node;
    union element {
        struct type3 *e;
        int val;
    } x;
};
然后,您可以通过以下方式访问它:

struct type1 *f;
f->x.e

你能出示
f
的声明吗?也许你的意思是
f->element.e
element
是联合标签,而不是成员名。尝试使用
struct{…union元素{…}elem;}
f.elem
@Darksky您的
struct
成员需要一个名称才能访问它。名称在类型后给出<代码>结构类型1{…;联合{…}元素;}将创建一个类型为(未标记)
union{…}
@Darksky的成员
元素
:在C 1999和更早版本中,在union声明的末尾添加一个名称不仅仅是给它一个与其类型不同的名称。它给它起了个名字。没有这个,它就没有名字;封闭结构中没有对象和成员。如果没有这些,它只是一个类型的声明,而不是一个成员的声明。@DanielFischer:C 2011引入了匿名联合和结构,在这种情况下,联合不需要名称。请阅读问题。这就是我所做的,这就是我得到的错误。@Darksky不。根据你的问题,你做了
f.element
,而不是
f->element
。不,我两者都做了。引用:
f.element->e,甚至只是f.element,我得到了
@Darksky
f.element->e
f.element
f->element
不一样
f.
指针始终是错误的
*f
(但无论如何,在编辑之前,union的问题仍然存在)。也许你应该为你的
f
调用malloc内存?
f
必须以某种方式初始化,是的。这里可能有一些C版本的问题。C 2011引入了匿名结构和联合,在这种情况下,
f->e
将与原始声明一起使用。但是,如果Darksky使用的是早期版本的C,则必须按照此答案中所示修改union声明。@EricPostpischil正确,但即使如此,也不会说:
f->element.e
f已在
malloc
中初始化。这就解决了问题。谢谢