【问题标题】:Initializing entire array with memset使用 memset 初始化整个数组
【发布时间】:2015-09-21 10:38:19
【问题描述】:

我已经用值 1 初始化了整个数组,但输出显示了一些垃圾值。但是如果我使用 0 或 -1 代替 1,这个程序可以正常工作。所以对于可以使用 memset 初始化什么类型的值有一些限制。

 int main(){
    int a[100];
    memset(a,1,sizeof(a));
    cout<<a[5]<<endl;
    return 0;
    }

【问题讨论】:

  • 是的,它适用于 -1 。你可以试试
  • 你可能应该先弄清楚sizeof(a)做了什么,然后你应该弄清楚memset()的第三个参数的类型是什么。这应该清除它。 PS。不要在 C++ 中这样做,这是不必要的,而且如您所见,错误
  • 如果你有一个现代编译器,你可能想试试std::fill(std::begin(a), std::end(a), 1);
  • 你的代码不是C++,是C。如果你真的用C++编译器,不要写C代码。

标签: c++ arrays memset


【解决方案1】:

memset,就像另一个说的那样,将数组的每个字节设置为指定的值。

这适用于 0 和 -1 的原因是因为两者都在任意大小上使用相同的重复模式:

(int) -1 is 0xffffffff
(char) -1 is 0xff

所以用0xff 填充内存区域将有效地用-1 填充数组。

但是,如果您使用1 填充它,则将每个字节设置为0x01;因此,这与将每个整数设置为值 0x01010101 相同,这不太可能是您想要的。

【讨论】:

    【解决方案2】:

    Memset 填充字节,来自cppreference:

    将值 ch 转换为 unsigned char 并将其复制到 dest 指向的对象的前 count 个字符中。

    您的 int 占用多个字节,例如32 位 int 将填充 1,1,1,1(在基数 256 中,在这种情况下字节序无关紧要),然后您会错误地将其解释为“垃圾”值。

    【讨论】:

    • 特别是0x01010101,这是您将在每个a 中形成的16843009 十进制,我预测这是您所看到的“垃圾”值。 -1 "works"(对于 "works" 的错误定义)因为它用 0xff 填充数组的内存,而 0xffffffff 是 -1 的 32 位表示。
    【解决方案3】:

    其他答案已经解释了std::memset。但最好避免这种低级功能和更高级别的程序。所以只需使用标准库及其 C++11 std::array

    #include <array>
    
    std::array<int, 100> a;
    a.fill(1);
    

    或者,如果您更喜欢 C 风格的数组,仍然使用标准库和 @BoPersson 所指示的 std::fill 算法

    #include <algorithm>
    #include <iterator>
    
    int a[100];
    std::fill(std::begin(a), std::end(a), 1);
    

    在大多数实现中,如果安全的话,两个版本都会调用std::memset

    【讨论】:

    • 小错字,应该是std::end(a)
    • @karsten tnx,已修复
    【解决方案4】:

    memset 是一个设置 bits 的操作。

    如果要设置值,请使用 for 循环。

    考虑一个 4 位整数:

    当位为 0001 但 memset 将其设置为 1111 时,其值为 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2014-08-04
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多