memmove 的实现

memmove的实现 memmove的原型是: void*memmove(void*dst, constvoid*src, size_tcount); 实现memmove有两个要点: (1)从src指向的内存拷贝count个字节到dst指向的内存中。 (2)处理src和dst有重叠的情况,这是和memcpy不一样的地方。 要满足条件(1)比较简单,借用memcpy的实现:... 阅读详情

baidu的笔试题目

用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)。
该函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。
注意,作为公用库函数,请注意安全检查,注意处理内存区重合的情况。

void*  memmove(void *dest, const void *src,size_t n)
{
    if (n == 0)
    {
        return 0;
    }


    /* 验证参数 */
    if (dest == NULL)  return 0;
    if (src == NULL)    return 0;


    char *psrc = (char*)src; 
    char *pdest = (char*)dest;


      /*检查是否有重叠问题 */
    if((dest <= psrc) || (pdest >= psrc + n))
        {
                /*正向拷贝*/
                for(int i=0; i < n; i++)
                {
                        *pdest = *psrc;
                        psrc++;
                        pdest++;
                }
        }
        else
        {
                /*反向拷贝*/
                psrc += n;
                pdest += n;
                for(int i=0;i<n;i++)
                {
                        psrc--;
                        pdest--;
                        *pdest = *psrc;


                }
        } 

    return dest;
} 

 

从glibc里找了memmove的源代码,如下

/* Copy memory to memory until the specified number of bytes
   has been copied.  Overlap is handled correctly.
   Copyright (C) 1991, 1995, 1996, 1997, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Torbjorn Granlund (tege@sics.se).

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <string.h>
#include <memcopy.h>
#include <pagecopy.h>

/* All this is so that bcopy.c can #include
   this file after defining some things.  */
#ifndef a1
#define a1 dest /* First arg is DEST.  */
#define a1const
#define a2 src /* Second arg is SRC.  */
#define a2const const
#undef memmove
#endif
#if !defined(RETURN) || !defined(rettype)
#define RETURN(s) return (s) /* Return DEST.  */
#define rettype  void *
#endif


rettype
memmove (a1, a2, len)
     a1const void *a1;
     a2const void *a2;
     size_t len;
{
  unsigned long int dstp = (long int) dest;
  unsigned long int srcp = (long int) src;

  /* This test makes the forward copying code be used whenever possible.
     Reduces the working set.  */
  if (dstp - srcp >= len) /* *Unsigned* compare!  */
    {
      /* Copy from the beginning to the end.  */

      /* If there not too few bytes to copy, use word copy.  */
      if (len >= OP_T_THRES)
 {
   /* Copy just a few bytes to make DSTP aligned.  */
   len -= (-dstp) % OPSIZ;
   BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);

   /* Copy whole pages from SRCP to DSTP by virtual address
      manipulation, as much as possible.  */

   PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);

   /* Copy from SRCP to DSTP taking advantage of the known
      alignment of DSTP.  Number of bytes remaining is put
      in the third argument, i.e. in LEN.  This number may
      vary from machine to machine.  */

   WORD_COPY_FWD (dstp, srcp, len, len);

   /* Fall out and copy the tail.  */
 }

      /* There are just a few bytes to copy.  Use byte memory operations.  */
      BYTE_COPY_FWD (dstp, srcp, len);
    }
  else
    {
      /* Copy from the end to the beginning.  */
      srcp += len;
      dstp += len;

      /* If there not too few bytes to copy, use word copy.  */
      if (len >= OP_T_THRES)
 {
   /* Copy just a few bytes to make DSTP aligned.  */
   len -= dstp % OPSIZ;
   BYTE_COPY_BWD (dstp, srcp, dstp % OPSIZ);

   /* Copy from SRCP to DSTP taking advantage of the known
      alignment of DSTP.  Number of bytes remaining is put
      in the third argument, i.e. in LEN.  This number may
      vary from machine to machine.  */

   WORD_COPY_BWD (dstp, srcp, len, len);

   /* Fall out and copy the tail.  */
 }

      /* There are just a few bytes to copy.  Use byte memory operations.  */
      BYTE_COPY_BWD (dstp, srcp, len);
    }

  RETURN (dest);
}
#ifndef memmove
libc_hidden_builtin_def (memmove)
#endif

memmove函数以及memmove模拟实现 前言: 我可以通过学习的难易顺序来分,可以说 strcpy函数 是最简单的复制(拷贝)函数,但是其只能运用于字符串,随后就是 momcpy函数 ,其实基于内存上的复制(拷贝)函数,相较于 strcpy函数 不会具有同样的局限性,但是 momcpy函数也是有其的巨大缺陷,其不能对本身进行覆盖拷贝,于是便有了 mommove函数 ,其是能够对本身进行覆盖拷贝的函数,其又同时兼备了 momcpy函数 可做的事。(注:保留 momcpy函数 是因为保证曾经代码的 ... 阅读详情

相关推荐

【C语言深度理解】memmove的模拟实现(超详细)

【C语言深度理解】memmove的模拟实现(超详细)

铭哥不写bug的博客 1237

【C语言】memmove函数的实现

memmove是一个用于拷贝一块区域的内存到另外一块区域的函数,定义如下返回值:返回,指向数据要被复制到的目的地source,从何处拷贝数据,指向数据的来源地num,你要拷贝的字节数下面是一个memmove的使用例子,它将arr1里的前12个字节复制到了arr2里的前12个字节,最后进行打印。

qq_42150700的博客 870

仰视源码,实现memmove

在我之前博客中写过一个内存复制函数memcopy(http://blog.youkuaiyun.com/z702143700/article/details/46628149),是根据源码修改而来,但是这个函数包括源码中都没有考虑一个问题,就是当memTo和memFrom有重叠的情况。 今天就根据源码实现memmove函数,感受下底层源码的极致实现。

奔跑的小河 9338

C语言实现memcpy、memmove库函数

关于memcpy和memmove这两个函数,不论是算法竞赛还是找工作面试笔试,对这两个函数必然是经常都会用到,而且面试的时候很有可能会让你把代码复现出来,也许会问你这两个库函数的区别,这都是你自学才能知道的,所以也是很能体现你实力的一种,所以说很重要,话不多说了,那就开始介绍吧。

weixin_60033897的博客 3028

【memmove函数的功能介绍及模拟实现】

memmove函数的功能介绍及模拟实现

qq_73900397的博客 609

MFC 利用soap 调用web service

MFC 利用soap 调用web service

congjiaoyan3682的博客 784

模拟实现memmove,memcpy,memset

模拟实现memmove,memcpy,memset

dragonroar 1386

慕课软件质量保证与测试(习题集)

慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试

weixin_42473228的博客 5万+

【C语言】memmove以及memmove的模拟实现

memmove以及memove的模拟实现

博主在编程学习中的总结、笔记 460

从FinFET到GAA:手把手解读2nm芯片制造的关键技术(含BSPDN避坑指南)

本文深入解读了2nm芯片制造从FinFET向全环绕栅极(GAA)晶体管架构演进的核心技术,并重点剖析了背面供电网络(BSPDN)的三种实现路径及其工程挑战。文章旨在帮助工程师理解技术变革的内在逻辑,并为应对2nm节点设计中的关键问题提供实用指南。

weixin_29294975的博客 292

重塑计算的五层蛋糕:解读黄仁勋CES2026演讲背后的AI新秩序与物理世界

2026年CES演讲揭示AI新纪元:从语言模型到物理智能 NVIDIA CEO黄仁勋在2026年CES演讲中描绘了计算产业的根本性变革。核心突破包括: 计算范式转移:从指令执行转向意图理解,智能体系统崛起 物理AI突破:发布Cosmos世界模型,通过合成数据训练AI理解物理定律 全新VeraRubin计算平台:6芯片协同设计,解决摩尔定律放缓与AI需求增长的矛盾 自动驾驶革命:推出具备推理能力的Alpamayo模型,实现L4级自动驾驶 演讲标志着AI正从数字世界迈向物理世界,NVIDIA通过全栈布局,正在重

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1273

C语言 实现memmove()

实现memmove() memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝size个字节到目标dst所指的内存地址的起始位置中。memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。 当出现下面图中的情况时 , memcpy并不能满足要求 但我在windows下的几种编译器中...

爱上小公举 2646

直流母线电压采集与缓冲调理电路

本文介绍了一种直流母线电压采集与缓冲调理电路的设计与应用。该电路通过电阻分压网络将高压直流母线电压降至适合ADC采样的范围,并采用运放电压跟随器实现高输入阻抗和低输出阻抗的缓冲功能,有效提高采样精度和抗干扰能力。文章重点阐述了低输出阻抗对驱动负载、抗干扰和电压稳定的重要性,并列举了该电路在工业电源监测、电动汽车BMS、通信电源和储能系统等领域的典型应用场景。

qq_37999850的博客 316

模拟实现memmove

memmove它在标准库中:void * memmove ( void * destination, const void * source, size_t num ); 它的用法主要是来弥补memcpy的不足,因为memcpy复制的两个内存位置不能有重叠,memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用mem...

小胡同学的博客 235

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4052

数据库小技能:数据导入脚本

背景:版本大升级,从2.0升级到3.0 ,服务端开发语言从c#换到java语言。数据库类型从microsalft sql server 换到mysql。数据来源于微信,用于查询卡bin。

专注于计算机研发知识和资讯分享 773

模拟实现memcpy、memmove

模拟实现memcpy 从源内存地址的起始位置开始拷贝若干个字节到目标内存地址 函数原型 : void* memcpy(void* dest, const void* src, size_t n); 参数类型: 指向目标内存指针,指向源内存的指针,拷贝字节数 返回值 : 返回一个目标内存区的指针dest #define _CRT_SECURE_NO_WARNINGS #include &l...

身在边城 心在编程 293

下采样新突破!ADown模块让YOLOv11多尺度特征提取更精准

ADown 凭借可编程梯度信息与多分支特征聚合的创新设计,打破了传统下采样在特征保留上的固有局限。本教程从原理到代码实现,再到工业场景适配,完整呈现了其在 YOLOv11 中的集成路径。只需简单新增模块脚本并修改配置文件,你的目标检测模型就能在多尺度特征捕捉能力上实现跨越式提升——无论是学术研究中的小目标检测突破,还是工业场景下的复杂多尺度任务落地,ADown 都能成为你攻克下采样瓶颈的利器。现在就动手尝试,让你的检测模型在下一代下采样技术的创新中再上一个台阶吧。

know_F0727的博客 524

memmove函数的实现

memmove函数的实现包括两个部分,一个是有内存覆盖的情况(即把一个字符串中首位置相对靠前的子串拷贝给首位置相对靠后的子串是),其他的就和memcopy函数的实现一样。 #include<stdio.h> #include<Windows.h> #include <assert.h> #include<stdlib.h> #include<a...

shoushou_的博客 1433

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

memmove的模拟实现

秒懂memmove的模拟实现

shylyly_的博客 1116

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

memmove实现

<br />memmove(void * memmove ( void * destination, const void * source, size_t num );)是<string.h>的标准函数,其作用是把从source开始的num个字符拷贝到destination。<br /> 最简单的方法是直接复制,但是由于它们可能存在内存的重叠区,因此可能覆盖了原有数据。<br /><br /> 比如当source+count>=dest&&source<dest时,dest可能覆盖了原有source的

烧鱼的专栏 1811

模拟实现memcpy,memmove以及memcpy与memmove的不同

首先看memcpy的用法 void* memcpy(void* destination, const void* source, size_t num); 函数memcpy是从source的位置开始向后复制num个字节的数据到destination的内存位置. 这个函数在遇到’\0’时不会停下来. 如果source和destination有任何的内存重叠,复制的结果都是未定义的! 接下来看memc...

persistence_Y的博客 242

模拟实现memcpy和memmove

在上一篇blog中,我们探讨了有关strcpy和strcmp等的字符串函数和对其的模拟实现。今天,我们着重讨论有关memcpy和memmove这两种内存函数,并模拟实现它们。首先我们要知道内存函数和字符串函数的区别,字符串函数像strcpy和ctrcmp的使用对象都为字符串,而面对整形或者浮点型就不适用了,因此我们在这里引出了内存函数。内存函数像memcpy和memmove等的使用对象是内存中的各个数据,不仅仅可以对于字符串还可以对整形数组或者字符数组进行操作。接下来我们来介绍这两个函数。

weixin_72917087的博客 385

【c语言】memmove函数以及模拟实现memmove函数

【代码】【c语言】memmove函数以及模拟实现memmove函数。

daydayup 466
上一篇: C/C++头文件一览
下一篇: strcpy()、memcpy()、memmove()、memset()的实现
LessonNo1
博客等级 码龄17年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值