C 如何初始化联合?
如果它是一个C 如何初始化联合?,c,unions,C,Unions,如果它是一个struct,那么它就可以完成 *p = {var1, var2..}; 但这似乎不适用于联盟: union Ptrlist { Ptrlist *next; State *s; }; Ptrlist *l; l = allocate_space(); *l = {NULL}; 只为了得到: expected expression before ‘{’ token 将其中一个字段指定为NULL。因为它是一个并集,所以所有字段都将为空。在
struct
,那么它就可以完成
*p = {var1, var2..};
但这似乎不适用于联盟
:
union Ptrlist
{
Ptrlist *next;
State *s;
};
Ptrlist *l;
l = allocate_space();
*l = {NULL};
只为了得到:
expected expression before ‘{’ token
将其中一个字段指定为NULL。因为它是一个并集,所以所有字段都将为空。在C99中,可以使用d: < C++ >, 在C89中,必须显式地执行此操作
typedef union {
int x;
float y;
void *z;
} thing_t;
thing_t foo;
foo.x = 2;
顺便问一下,你知道在C联合中
输出:
x:0xbfebc y:0xbfebc z:0xbfebc
我没有
状态
类,所以我用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
union Ptrlist1
{
char *next;
char *s;
};
union Ptrlist1 l = { NULL };
请参见下面的联合初始化示例。
就你的情况而言,我认为这是一个错误
Ptrlist how can be member of union..??
你应该写
union Ptrlist
{
union Ptrlist *next;
State *s;
};
初始化和赋值之间有区别。初始化是智能的,而对于分配,您需要解析正确的地址 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 例子 字符str[]=“xyz”;//works-初始化 char-str[10]; str=“xyz”;//错误分配 //str是一个可以保存字符而不是字符串的地址 同样地 Ptrlist l={NULL};//works-初始化 Ptrlist*l; l->next=NULL;//作业 l={NULL};//是赋值,不知道地址空间错误
您的联合中有两种指针类型。您正在尝试将哪一个初始化为null?你希望编译器(或读者)怎么知道?@James Wilcox,我知道我可以通过
u.field1=NULL;u、 field2=NULL
但这不是一种冗余吗?问题是在上面的代码中您试图初始化哪个字段。我和编译器都不知道您试图访问的是next
还是s
。我想您误解了什么是union
。一次只能(安全地)使用一个字段。如果希望能够访问这两个字段,则需要一个struct
。如果您只是想确保整个该死的内容都为空,那么在这种情况下,您可以选择其中一个,因为指针类型(可能)具有相同的长度。@JamesWilcox-ptr类型可能具有相同的长度,并且同样重要的是,它们很可能会占用内存中相同的空间(即对齐)。但是,这是不安全的,所以我会认为你的评论是“危险的”。可以使用“packed”或类似的声明属性来增加这一点的正确性,但一旦进入依赖于实现的代码领域,就可以验证成员是否对齐,即使没有该属性。
union Ptrlist
{
union Ptrlist *next;
State *s;
};
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