代码之家  ›  专栏  ›  技术社区  ›  Rodrigo

如何将4字节同时赋值为C++中字符数组的特定索引

  •  0
  • Rodrigo  · 技术社区  · 6 年前

    我想用0初始化char数组的最后4个字节(将所有32位都设置为零)。但该赋值只改变了数组中的一个字节。如何在一个命令中更改这个字节和接下来的三个字节,而不是循环遍历所有4个字节?这有可能吗?

    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main() {
        char buf[8 + 4]; // 8 bytes of garbage + 4 = 32 safety bits
        buf[8] = (uint32_t)0; // turns all safety bits into zero???
        cout << hex << setfill(' ');
        for (int i=0; i<8 + 4; i++) {
            cout << setw(3) << (int)buf[i];
        }
        cout << dec << endl;
        return 0;
    }
    

    显示:

      0  9 40  0  0  0  0  0  0  8 40  0
         ^  ^                    ^  ^
       ok garbage              undesired
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Serge    6 年前

    如果不想初始化整个数组,可以使用memset或类似的函数。

    #include <string.h>
    
    ...
    memset(&buf[8], 0, 4);
    

    基于评论,我添加了一个类似C++的方法来做同样的事情:

    #include <algorithm>
    ...
     std::fill(&a[8],&a[8+4],0);
    
        2
  •  1
  •   snake_style    6 年前

    还有另一种选择:

    *(uint32_t*)(&buf[8]) = 0;
    

    或者,更多的C++方式:

    #include <algorithm>
    
    std::fill(buf + 8, buf + 12, 0);