如何初始化一个联合体?

21
如果它是一个结构体,则可以完成。
*p = {var1, var2..};

但是似乎这种方法不能用于 union

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

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

仅仅得到:

expected expression before ‘{’ token

1
你的联合体中有两种指针类型。你试图将哪一个初始化为null?你希望编译器(或读者)如何知道? - James Wilcox
@James Wilcox,我知道我可以通过 u.field1=NULL;u.field2=NULL 来实现,但这不是有些冗余吗? - lexer
@James Wilcox,我想将所有字段初始化为NULL。 - lexer
1
我认为你误解了union的含义。每次只能(安全地)使用一个字段。如果你想要访问两个字段,你需要一个struct。如果你只是想确保整个东西都被置空,那么在这种情况下你可以选择任意一个,因为指针类型(可能)具有相同的长度。 - James Wilcox
1
@JamesWilcox - ptr类型可能具有相同的长度,而且同样重要的是它们很可能占用内存中相同的空间(即对齐)。但是,这并不是保证的,因此我认为您的评论是“危险的”。可以使用声明属性,例如“packed”或类似属性来增加正确性的机会,但是一旦进入实现相关代码的领域,即使没有属性,也可以验证成员是否对齐。 - ysap
显示剩余2条评论
5个回答

36

C99中,你可以使用指定联合初始化器:

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语言的union联合中,所有成员变量共享同一块内存空间

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


3

初始化和赋值有所不同。初始化是智能的,而对于赋值,您需要解决正确的地址。

    例子
    char str[] = "xyz";    // 正确 - 初始化 
    char str[10];
    str = "xyz";            // 错误 - 赋值
                           // str是一个可以容纳字符而不是字符串的地址
同样地, Ptrlist l = {NULL}; // 正确 - 初始化 Ptrlist *l; l->next = NULL; // 正确 - 赋值 l = {NULL}; // 是赋值,不知道地址空间错误

0

我没有一个名为State的类,所以我用一个整数替换了它。

这是我的代码:

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


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;
 };

0

将其中一个字段分配为NULL。由于这是一个联合体,所有的字段都将为NULL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接