如何初始化联盟?

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

 *p = {var1, var2..}; 

但似乎这对union不起作用:

 union Ptrlist { Ptrlist *next; State *s; }; Ptrlist *l; l = allocate_space(); *l = {NULL}; 

只得到:

 expected expression before '{' token 

在C99中,您可以使用ad esignated union初始化程序 :

 union { char birthday[9]; int age; float weight; } people = { .age = 14 }; 

在C ++中, 联合可以有构造函数 。

在C89中,您必须明确地执行此操作。

 typedef union { int x; float y; void *z; } thing_t; thing_t foo; foo.x = 2; 

那么,您是否意识到在C联盟中, 所有成员共享相同的内存空间 ?

 int main () { thing_t foo; printf("x: %py: %pz: %p\n", &foo.x, &foo.y, &foo.z ); return 0; } 

输出

x:0xbfbefebc y:0xbfbefebc z:0xbfbefebc

初始化和分配之间存在差异。 初始化是智能的,而对于分配,您需要解析正确的地址。


    例
     char str [] =“xyz”;  //工作 - 初始化 
     char str [10];
     str =“xyz”;  //错误 - 分配
                            // str是一个可以保存char而不是string的地址

    同样
     Ptrlist l = {NULL};  //工作 - 初始化 
     Ptrlist * l;
     l-> next = NULL;  //作品任务
     l = {NULL};  //是赋值,不知道地址空间错误

将其中一个字段指定为NULL。 由于它是一个联合,因此所有字段都将为NULL。

我没有State类,所以我用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; };