memset()的意外行为

Unexpected behaviour of memset()

本文关键字:意外 memset      更新时间:2023-10-16

我正在初始化所有元素中的99数组

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

但我得到的结果出乎意料。

输出:-

1667457891

这个内存集函数异常行为背后的原因是什么。

首先,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也适用。

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