【问题标题】:Zeroing out anonymous union [duplicate]将匿名联合归零[重复]
【发布时间】:2012-07-13 11:19:49
【问题描述】:

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

【问题讨论】:

标签: c++ c undefined-behavior unions


【解决方案1】:

在您的简单情况下,它是相同的,但这只是因为(很可能)int(和unsignedunsigned int 的缩写)是 32 位(即四个字节)。如果数组更大,或者int只有16位,就不一样了。

【讨论】:

    【解决方案2】:

    我认为这段代码更好:

    memset(name, 0, max(sizeof(name), sizeof(int)));
    

    【讨论】:

      【解决方案3】:

      在 C 中你最好这样做

      union
      {
         char name[sizeof(unsigned)];
         unsigned value;
      };
      

      现在一个隐式初始化器,例如,如果您初始化周围的struct,将始终将您的名称字段初始化为所有0。如果unsigned 没有填充位(这很可能),0value 的初始化或分配也将始终将name 归零。

      C++ 的规则不同,似乎从您写入的不同字段读取的是 UB。

      【讨论】:

        【解决方案4】:

        之间

        name[0] = 0;
        

        name[1] = 0;
        

        name[2] = 0;
        

        name[3] = 0;
        

        其他函数可以改变其他字节。所以,

        value = 0; 
        

        我认为更安全

        【讨论】:

          【解决方案5】:

          是的,但前提是sizeof(unsigned)==4

          【讨论】:

          • 或者如果大小是 8 等等......任何 >= 4.
          【解决方案6】:

          是的,如果您使用的是 64 位计算机,那就对了。如果不是,您将覆盖 name 的前 2 个字符,因为在 32 位机器上,unsigned 的大小是 2 字节而不是 4(或更高)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-26
            • 1970-01-01
            • 2014-10-21
            • 1970-01-01
            • 2019-06-01
            • 2012-05-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多