如何初始化联盟?

时间:2011-08-10 09:47:25

标签: c unions

如果它是struct,则可以完成

*p = {var1, var2..};

但似乎这不适用于union

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

Ptrlist *l;
l = allocate_space();
*l = {NULL};

只得到:

expected expression before ‘{’ token

5 个答案:

答案 0 :(得分:25)

在C99中,您可以使用d esignated union initializer

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

在C ++中,unions can have constructors

在C89中,你必须明确地做到这一点。

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

thing_t foo;
foo.x = 2;

顺便提一下,您是否知道在C联盟all the members share the same memory space

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

输出

  

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

答案 1 :(得分:2)

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


    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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我没有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

答案 4 :(得分:0)

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

union Ptrlist1 l = {  NULL };

看到这个联合初始化的例子。 在你的情况下,我认为

有一些错误
  Ptrlist how can be member of union..??

你应该写

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