我已经用值1初始化了整个数组,但输出显示了一些垃圾值。但是如果我使用0或-1代替1,这个程序可以正常工作。那么对使用memset初始化什么类型的值有一些限制。
int main(){
int a[100];
memset(a,1,sizeof(a));
cout<<a[5]<<endl;
return 0;
}
答案 0 :(得分:3)
memset将数组的每个字节设置为指定的值。
这与0和-1一起使用的原因是因为两者在任意大小上都使用相同的重复模式:
(int) -1 is 0xffffffff
(char) -1 is 0xff
因此使用0xff
填充内存区域将有效地填充数组-1。
但是,如果您使用1
填充它,则将每个字节设置为0x01
;因此,将每个整数设置为值0x01010101
都是一样的,这很不可能是你想要的。
答案 1 :(得分:1)
Memset从cppreference填充字节:
将值ch转换为unsigned char并将其复制到dest指向的对象的每个第一个计数字符中。
您的int
需要几个字节,例如一个32位的int将填充1,1,1,1(在256的基数中,endianess在这种情况下并不重要),然后你将其误解为&#34;垃圾&#34;值。
答案 2 :(得分:1)
其他答案已经解释过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
。
答案 3 :(得分:-1)
memset是一个设置位的操作。
如果要设置值,请使用for循环。
考虑一个4位整数:
当位为0001时,其值为1,但memset将其设置为1111