使用 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 初始化整个数组的主要内容,如果未能解决你的问题,请参考以下文章