首页 > 其他分享 >模拟memcpy和memmove

模拟memcpy和memmove

时间:2024-04-09 19:01:01浏览次数:22  
标签:count src memmove dest void char NULL memcpy 模拟

memcpy是内存复制函数,原型如下

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

从src地址复制count个字节到dest

模拟实现

void *memcpy(void *dest, const void *src, size_t count) {
    if (dest == NULL || src == NULL)
        return NULL;
    void *ans = dest;
    for (int i = 0; i < count; ++i) {
        *((char *) dest + i) = *((char *) src + i);
    }
    return ans;
}

无法处理重叠问题,如123456789自移动12345成为123412345,用memcpy会变成123412341,因为后移动的元素已经被先前移动的覆盖

于是有memove可以处理这种情况,原型

void * memmove ( void * destination, const void * source, size_t num )

从后往前复制可以避免这种情况 

void *memmove(void *dest, const void *src, size_t count) {
    if (dest == NULL || src == NULL)
        return NULL;
    void *ans = dest;
    if (dest < src)
        for (int i = 0; i < count; ++i) {
            *((char *) dest + i) = *((char *) src + i);
        }
    else
        while (--count) {
            *((char *) dest + count) = *((char *) src + count);
        }
    return ans;
}

 测试

int main() {
    char cpy[] = "123456789";
    memcpy(cpy + 4, cpy, 5);
    std::cout << cpy << std::endl;
    char move[] = "123456789";
    memmove(move + 4, move, 5);
    std::cout << move;
}

标签:count,src,memmove,dest,void,char,NULL,memcpy,模拟
From: https://blog.csdn.net/weixin_62264287/article/details/137555613

相关文章

  • 模拟SQLserver死锁现象
    SQLServer死锁是指两个或多个事务相互等待对方持有的资源而无法继续执行的情况。当两个或多个事务都持有一些资源并且试图获取其他事务持有的资源时,可能会发生死锁。这种情况下,每个事务都在等待另一个事务释放其所需的资源,导致所有涉及的事务都无法继续执行,形成了死锁。死锁通常......
  • 模拟心电芯片LHE7909兼容代替ADS1291
    在大时代的浪潮下,以美国为首的欧美企业,对于中国实施制裁,不仅导致了局势的紧张,也导致了近年来芯片市场的混乱,部分进口芯片一度价格攀升。以心电芯片为例,高精度的ECG信号是医生用来准确判断用户心脏健康的依据。此类专用芯片技术门槛较高,目前主要被国外如TI,ADI等巨头公司垄断。......
  • 第十五届蓝桥杯第三期模拟赛 《台阶问题》
    问题描述小蓝要上一个楼梯,楼梯共有n级台阶(即小蓝总共要走n级)。小蓝每一步可以走a级、b级或c级台阶。请问小蓝总共有多少种方案能正好走到楼梯顶端?输入格式输入的第一行包含一个整数n。第二行包含三个整数a,b,c。输出格式输出一行包含一个整数,表示答案。答......
  • strcpy的模拟实现
        strcmp(arr1,arr2)是将arr2的内容拷贝到arr1当中。接下来我们来看看如何模拟实现:我们首先得创建一个函数,传入arr1与arr2当前的内容。assert保证函数的健壮性,以防传入的数组为空指针。再通过指针*arr2++=*arr1++,一个字节一个字节的传入,直到*arr2=0时结束循环,最终实......
  • strcat追加字符串以及其模拟实现
        如此处代码将arr2追加到arr1中的字符串后面。这样就要用两次循环达到字符串的效果,第一次循环是要找到arr1当中'\0'的位置,第二次循环就将src的字符串加入到dest斜杠0后的位置,直到*src==0,结束字符串的追加。#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#i......
  • java计算机毕业设计驾校在线模拟考试小程序【附源码+远程部署+程序+mysql】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在现代社会,驾驶汽车已成为人们生活中不可或缺的一部分。随着机动车数量的激增,道路安全问题也日益凸显,因此,掌握正确的驾驶知识和技能对于每位驾驶员来说都......
  • 模拟CMOS集成电路学习笔记:单级放大器(1)
            放大器顾名思义是将信号进行放大,在简单电路中我们经常默认为放大是一种线性行为,即y=kx+t。在模拟集成电路中,一个放大器需要考虑的东西有很多比如功耗、线性度、最大电压摆幅、增益等等。        如图即为拉扎维先生所提到的模拟电路设计八边形法则,这......
  • 【C++进阶】详解红黑树&&手撕红黑树(模拟实现)!!!
    红黑树详解&&模拟实现一,红黑树的概念二,红黑树的特性三,红黑树的结构四,红黑树的迭代器五,模拟实现红黑树插入操作六,红黑树的检查一,红黑树的概念红黑树也是一颗二叉搜索树,相比于AVL树的插入,红黑树没有那么多的旋转,对平衡的检查没有那么的严格,所以是接近平衡的。红黑树,......
  • uni-app项目运行到Android Studio模拟器
    1.启动模拟器①可以在AndroidStudio中打开安装好的模拟器②也可以不通过AndroidStudio,使用指令直接启动模拟器首先找到AndroidStudio模拟器安装位置,一般如下图:AppData文件夹默认隐藏,需要设置可见。然后再该路径下打开cmd控制台,输入指令emulator.exe-list-avds可......
  • 流域生态系统水-碳-氮耦合过程模拟
    流域是一个相对独立的自然地理单元,它是以水系为纽带,将系统内各自然地理要素连结成一个不可分割的整体。碳和氮是陆地生态系统中最重要的两种化学元素,而在流域系统内,水-碳-氮是相互联动、不可分割的耦合体。随着流域内人类活动的加剧,流域已成为区域内人地关系十分敏感而复杂的地......