memset()的意外行为

时间:2012-10-27 17:16:14

标签: c++ cstring

我在所有元素中使用99初始化数组

#include<iostream>
#include<cstring>
int main(){
    int a[10];
    memset(a,99,10);
    std::cout<<a[0]<<std::endl;
    return 0;
}

但我得到的输出是出乎意料的。

输出: -

  

1667457891

此memset函数异常行为背后的原因是什么。

2 个答案:

答案 0 :(得分:11)

首先,memset取大小(以字节为单位),而不是数组元素的数量,因为它无法知道每个元素的大小。您需要使用sizeof来获取数组的字节大小,并将其赋予memset

memset(a, 99, sizeof(a));

但是,在C ++中,更喜欢std::fill,因为它类型安全,更灵活,有时可以更高效:

std::fill(begin(a), end(a), 99);

第二个也是更紧迫的问题是memsetfill在这种情况下有不同的行为,所以你必须决定你想要的:memset将设置每个字节到99,而fill会将每个元素(在你的情况下每个int)设置为99.如果你想要一个等于99的整数数组,我展示时使用fill。如果您希望将每个字节设置为99,我建议将int*转换为char*并使用fill而不是memset,但memset将为此工作。

答案 1 :(得分:1)

问题是memset将每个字节设置为99,因此第一个int为0x63636363,等于1667457891.请改用std::fill