栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

memcpy 与memmove

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

memcpy 与memmove

memmove 是在memcpy基础上的升级版

注意函数的返回类型和  指针类型皆为void* 说明函数适应于不同类型的数据结构

并不局限于整形或字符串 

函数具体实现逻辑在篇尾

void* my_memmove(void* dest, const void* src, size_t count)

这里const修饰后面src 前面dest不被修饰是由于  运行后dest将被改变 而src是源字符串自始至终未被改变所以要用const修饰来限制src指针
{
    assert(dest && src);

由于防止出现空指针 所以这里要断言 若出现空指针则程序无法运行
    void* ret = dest;
    //前后形
    //if (dest < src)
    //{
    //    //前->后
    //    while (count--)
    //    {
    //        *(char*)dest = *(char*)src;
    //        dest = (char*)dest + 1;
    //        src = (char*)src + 1;
    //    }
    //}
    //else
    //{
    //    //后->前
    //    while (count--)
    //    {
    //        *((char*)dest + count) = *((char*)src + count);

    //    }
    //}

    //两头形
    if (dest > src && dest < (void*)((char*)src + count))//注意char*和返回值类型不同  需强转
    {
        //后->前
        while (count--)
        {
            *((char*)dest + count) = *((char*)src + count);

        }
    }
    else
    {
        //前->后
        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    return ret;

}
int main()
{
    int arr1[9] = { 1,2,3,4,5,6,7,8,9 };
    my_memmove(arr1 + 3, arr1, 20);
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr1[i]);
    }
    return 0;
}

该代码运行结果为123123459

strtok为分割字符串函数,可根据字符串中指定符号 来分割字符串

1   2   3   4   5   6   7   8   9 

 

若相反dest

就是8覆盖1,7覆盖2,6覆盖3,5覆盖4,这样到4覆盖是找不到初始值4 而是覆盖后的5

所以不行

dest>src 时同理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号