可能重复:
Set all bytes of int to (unsigned char)0, guaranteed to represent zero?
我在结构体中有以下匿名联合:
union
{
unsigned value;
char name[4];
};
我可以替换以下代码:
name[0] = 0;
name[1] = 0;
name[2] = 0;
name[3] = 0;
使用以下代码?
value = 0;
答案 0 :(得分:2)
在你的简单情况下,它是相同的,但只是因为(最有可能)int
(和unsigned
是unsigned int
的缩写)是32位(即四个字节)。如果数组较大,或int
只有16位,则不一样。
答案 1 :(得分:1)
我认为这段代码更好:
memset(name, 0, max(sizeof(name), sizeof(int)));
答案 2 :(得分:1)
在C中你最好做
union
{
char name[sizeof(unsigned)];
unsigned value;
};
现在,隐式初始化程序(例如,如果您初始化周围的struct
)将始终将您的名称字段初始化为所有0
。并且如果unsigned
没有填充位(很可能),0
到value
的初始化或分配也将始终归零name
。
C ++的规则是不同的,似乎从你写的不同字段中读取的是UB。
答案 3 :(得分:0)
之间
name[0] = 0;
和
name[1] = 0;
和
name[2] = 0;
和
name[3] = 0;
其他函数可以更改其他字节。所以,
value = 0;
我认为更安全
答案 4 :(得分:0)
是的,但仅限于sizeof(unsigned)==4
。
答案 5 :(得分:-1)
是的,如果您使用的是64位计算机,那就是正确的。如果不是,您将覆盖名称中的前2个字符,因为在32位计算机上unsigned
的大小为2字节而不是4(或更高)。