memset()的意外行为

dea*_*mer 5 c++ cstring

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

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

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

输出: -

1667457891

这个memset函数异常行为背后的原因是什么?

Set*_*gie 11

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

memset(a, 99, sizeof(a));
Run Code Online (Sandbox Code Playgroud)

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

std::fill(begin(a), end(a), 99);
Run Code Online (Sandbox Code Playgroud)

第二个和更迫切的问题是,memsetfill在这种情况下不同的行为,所以你必须决定你想要的:在memset将各设置一个字节为99,而fill将分别设置元素(每个int如果你想要一个你的情况)至99数组充满了等于99的整数,fill按照我展示的方式使用.如果你想将每个字节设置为99,我建议将其转换int*为a char*并使用fillon而不是memset,但memset也适用于此.