如果它是struct
,则可以完成
*p = {var1, var2..};
但似乎这不适用于union
:
union Ptrlist
{
Ptrlist *next;
State *s;
};
Ptrlist *l;
l = allocate_space();
*l = {NULL};
只得到:
expected expression before ‘{’ token
答案 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;
};