繁体   English   中英

使用 memset 初始化整个数组

[英]Initializing entire array with memset

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

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

换句话说,memset 将数组的每个字节设置为指定的值。

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

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

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

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

Memset 填充字节,来自cppreference

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

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

其他答案已经解释了std::memset 但最好避免使用此类低级功能并在更高级别上编程。 所以只需使用标准库及其 C++11 std::array

#include <array>

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

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

#include <algorithm>
#include <iterator>

int a[100];
std::fill(std::begin(a), std::end(a), 1);

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

memset 是一种设置的操作。

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

考虑一个 4 位整数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM