使用memset初始化整个数组

时间:2015-09-21 10:38:20

标签: c++ arrays memset

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

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

4 个答案:

答案 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