归零匿名联盟

时间:2012-07-13 11:19:50

标签: c++ c undefined-behavior unions

  

可能重复:
  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;

6 个答案:

答案 0 :(得分:2)

在你的简单情况下,它是相同的,但只是因为(最有可能)int(和unsignedunsigned 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没有填充位(很可能),0value的初始化或分配也将始终归零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(或更高)。