Подтвердить что ты не робот

Как инициализировать объединение?

Если это a struct, то это можно сделать

*p = {var1, var2..};

Но похоже, что это не работает с union:

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

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

Только для получения:

expected expression before ‘{’ token
4b9b3361

Ответ 1

В C99 вы можете использовать d инициализатор инициализации:

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

В С++ союзы могут иметь конструкторы.

В 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: %p  y: %p  z: %p\n",
     &foo.x, &foo.y, &foo.z );
   return 0;
}

выход:

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

Ответ 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

Ответ 3

Назначьте одно из полей NULL. Поскольку это объединение, все поля будут NULL.

Ответ 4

У меня нет класса 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 and next addres is same 
    // and this will output 10
    printf("%d", *(l->next));

    getch();
    return 0;
}

Таким образом, значение n инициализируется до 10

Ответ 5

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

union Ptrlist1 l = {  NULL };

см. пример примера инициализации объединения. в вашем случае я думаю, что есть некоторая ошибка в

  Ptrlist how can be member of union..??

вам следует написать

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