memset - 内存设置函数

image.png

将缓冲区设置为指定的字符

以字节为单位进行初始化


int main()
{
    int arr[] = {1,2,3,4,5};
    
    memset(arr,0,20);	//初始化20个字节内容为0
    
    memset(arr,1,20);	//初始化20个字节内容为1
    return 0;
}

最初: image.png

设置20个字节为0后->

image.png


设置20个字节为1后

image.png


注意点:以字节为单位进行初始化


模拟实现memset

注意:由于不知道传过来的是什么类型->使用void*类型接收,由于要设置的字节数恒大于0,所以用size_t接收,

由于只知道要设置的字节数,不知道是什么类型->所以使用char 一个字节一个字节的向后设置*

返回目标空间的起始地址


写法1:接收类型为整形

memset:将缓冲区设置为指定的字符所以要把整形强转为字符型,再把每一个字节设置为整形对应ascii的字符

void* my_memset(void* dest, int c, size_t count)
{
    assert(dest);
    void* tmp = dest;
    char set_c = (char)c;
    //内存设置,共设置count个字节
    while (count--)
    {
        *(char*)dest = set_c;
        dest = (char*)dest + 1;
    }
    return tmp;
}
int main()
{
    int arr[] = { 1,2,3,4,5 };

    my_memset(arr, 0, 20);	//初始化20个字节内容为0

    my_memset(arr, 1, 20);//初始化20个字节的内容为1
    return 0;
}

写法2:接收类型为字符

若直接设置字符,要设置的是其对应的值 1 而不是其对应的ascii码值。所以要减去‘0’

‘1’ - ‘0’ -> 1 所以接收的字符还要减上字符0

void* my_memset(void* dest, char c, size_t count)
{
    assert(dest);
    void* tmp = dest;
    //内存设置,共设置count个字节
    while (count--)
    {
        *(char*)dest = c - '0';
        dest = (char*)dest + 1;
    }
    return tmp;
}
int main()
{
    int arr[] = { 1,2,3,4,5 };

    my_memset(arr, '0', 20);	//初始化20个字节内容为0

    my_memset(arr, '1', 20);
    return 0;
}