C 如何初始化联合?

C 如何初始化联合?,c,unions,C,Unions,如果它是一个struct,那么它就可以完成 *p = {var1, var2..}; 但这似乎不适用于联盟: union Ptrlist { Ptrlist *next; State *s; }; Ptrlist *l; l = allocate_space(); *l = {NULL}; 只为了得到: expected expression before ‘{’ token 将其中一个字段指定为NULL。因为它是一个并集,所以所有字段都将为空。在

如果它是一个
struct
,那么它就可以完成

*p = {var1, var2..};
但这似乎不适用于
联盟

union Ptrlist
{
        Ptrlist *next;
            State *s;
};

Ptrlist *l;
l = allocate_space();
*l = {NULL};
只为了得到:

expected expression before ‘{’ token

将其中一个字段指定为NULL。因为它是一个并集,所以所有字段都将为空。

在C99中,可以使用d:

< C++ >,

在C89中,必须显式地执行此操作

typedef union {
  int x;
  float y;
  void *z;
} thing_t;

thing_t foo;
foo.x = 2;
顺便问一下,你知道在C联合中

输出:

x:0xbfebc y:0xbfebc z:0xbfebc


我没有
状态
类,所以我用int替换了它

这是我的代码:

union Ptrlist
{
    Ptrlist *next;
    int *n;
};


int main(int argc, char** argv)
{
    Ptrlist *l = new Ptrlist;

    // I'm using a way c++ allocated memory here, you can change it to malloc.
    l->n = new int;
    *(l->n) = 10;

    // Because you used an union, n's and next's addres is same 
    // and this will output 10
    printf("%d", *(l->next));

    getch();
    return 0;
}
这样,n的值被初始化为10

union Ptrlist1
{
    char *next;
    char  *s;
};

union Ptrlist1 l = {  NULL };
请参见下面的联合初始化示例。 就你的情况而言,我认为这是一个错误

  Ptrlist how can be member of union..??
你应该写

 union Ptrlist
 {
    union Ptrlist *next;
        State *s;
 };

初始化和赋值之间有区别。初始化是智能的,而对于分配,您需要解析正确的地址

Example char str[] = "xyz"; // works - initialization char str[10]; str = "xyz"; // error - assignment // str is a address that can hold char not string Similarly Ptrlist l = {NULL}; // works - initialization Ptrlist *l; l->next = NULL; // works assignment l = {NULL}; // is assignment, don't know the address space error 例子 字符str[]=“xyz”;//works-初始化 char-str[10]; str=“xyz”;//错误分配 //str是一个可以保存字符而不是字符串的地址 同样地 Ptrlist l={NULL};//works-初始化 Ptrlist*l; l->next=NULL;//作业 l={NULL};//是赋值,不知道地址空间错误
您的联合中有两种指针类型。您正在尝试将哪一个初始化为null?你希望编译器(或读者)怎么知道?@James Wilcox,我知道我可以通过
u.field1=NULL;u、 field2=NULL
但这不是一种冗余吗?问题是在上面的代码中您试图初始化哪个字段。我和编译器都不知道您试图访问的是
next
还是
s
。我想您误解了什么是
union
。一次只能(安全地)使用一个字段。如果希望能够访问这两个字段,则需要一个
struct
。如果您只是想确保整个该死的内容都为空,那么在这种情况下,您可以选择其中一个,因为指针类型(可能)具有相同的长度。@JamesWilcox-ptr类型可能具有相同的长度,并且同样重要的是,它们很可能会占用内存中相同的空间(即对齐)。但是,这是不安全的,所以我会认为你的评论是“危险的”。可以使用“packed”或类似的声明属性来增加这一点的正确性,但一旦进入依赖于实现的代码领域,就可以验证成员是否对齐,即使没有该属性。
 union Ptrlist
 {
    union Ptrlist *next;
        State *s;
 };
Example char str[] = "xyz"; // works - initialization char str[10]; str = "xyz"; // error - assignment // str is a address that can hold char not string Similarly Ptrlist l = {NULL}; // works - initialization Ptrlist *l; l->next = NULL; // works assignment l = {NULL}; // is assignment, don't know the address space error