使用 memset 初始化整个数组

Posted

技术标签:

【中文标题】使用 memset 初始化整个数组【英文标题】:Initializing entire array with 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代码。 【参考方案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

【讨论】:

以上是关于使用 memset 初始化整个数组的主要内容,如果未能解决你的问题,请参考以下文章

memset 初始化数组 & 实现原理

在JAVA中有没有象C语言里的memset函数

使用 memset 初始化包含数组的结构向量

使用 memset 初始化指针元素的二维数组

在 C++ 中使用 memset 初始化具有不同值的结构数组元素

使用 memset 进行初始化的 C 动态分配数组