memeset使用&模拟实现

举报
芒果_Mango 发表于 2022/02/26 21:42:58 2022/02/26
【摘要】 「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」 memset - 内存设置函数将缓冲区设置为指定的字符以字节为单位进行初始化int main(){ int arr[] = {1,2,3,4,5}; memset(arr,0,20); //初始化20个字节内容为0 memset(arr,1,20); //初始化20个字节内容为...

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

memset - 内存设置函数

image-20220209221438691

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

以字节为单位进行初始化


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

最初:

image-20220209221450279

设置20个字节为0后->

image-20220209221459278

设置20个字节为1后

image-20220209221513903

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


模拟实现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;
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。