Как инициализировать объединение?
Если это a struct
, то это можно сделать
*p = {var1, var2..};
Но похоже, что это не работает с union
:
union Ptrlist
{
Ptrlist *next;
State *s;
};
Ptrlist *l;
l = allocate_space();
*l = {NULL};
Только для получения:
expected expression before ‘{’ token
Ответы
Ответ 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;
};