我在结构中有以下匿名联合:
union
{
unsigned value;
char name[4];
};
我可以替换以下代码:
name[0] = 0;
name[1] = 0;
name[2] = 0;
name[3] = 0;
用下面的代码?
value = 0;
我在结构中有以下匿名联合:
union
{
unsigned value;
char name[4];
};
我可以替换以下代码:
name[0] = 0;
name[1] = 0;
name[2] = 0;
name[3] = 0;
用下面的代码?
value = 0;
在您的简单情况下,它是相同的,但这只是因为(最有可能)int
(并且unsigned
是 的缩写unsigned int
)是 32 位(即四个字节)。如果数组更大,或者int
只有 16 位,则不会相同。
我认为这段代码更好:
memset(name, 0, max(sizeof(name), sizeof(int)));
在C中你最好做
union
{
char name[sizeof(unsigned)];
unsigned value;
};
现在一个隐式初始化器,例如,如果你初始化了周围的struct
,总是将你的 name 字段初始化为 all 0
。并且提供unsigned
没有填充位(这很可能)初始化或分配0
tovalue
也将始终归零name
。
C++ 的规则不同,似乎从您写入的不同字段读取的是 UB。
之间
name[0] = 0;
和
name[1] = 0;
和
name[2] = 0;
和
name[3] = 0;
其他函数可以更改其他字节。所以,
value = 0;
我认为更安全
是的,但仅当sizeof(unsigned)==4
.
是的,如果您使用的是 64 位机器,那就对了。如果不是,您将覆盖 name 的前 2 个字符,因为在 32 位机器上unsigned
的大小是 2 字节而不是 4(或更高)。