void * memcpy ( void * destination, const void * source, size_t num );
该函数是内存操作的拷贝函数,函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,在遇到 '\0' 的时候并不会停下来。同时该函数的返回类型和参数类型为void*,这也就说明了该函数的业务逻辑不仅仅可以对字符串进行拷贝,还可以对其他数据类型进行拷贝,这就是它与strcpy函数最大的不同。
谈到这个函数,就会想到它的姊妹memmove函数,两者之间有何差别?
对于老版本的编译器来说,可能两者之间的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。但是经过实践证明,对于较新版本的编译器来说两者几乎无差别都可以处理内存重叠问题,可以认为mencpy约等于memmove。因此在进行模拟实现的时候只实现一种,这里我选择实现memcpy函数。
        ​​​​​​模拟实现前的问题分析:
        由于函数参数是无类型指针,因此传入的参数要进行类型强转,这里选择无符号字符指针强转,以1字节为单位进行拷贝。在设计时要考虑空间重叠问题,如果传入的参数内存空间不重叠,则正常的从左向右拷贝即可正常完成;但是如果空间重叠,比如dst指针指向的是src指针指向字节的后一个字节,则拷贝出来的字符串是源字符串的一串首字符。比如,“hello”我们把该字符串拷贝到该字符串字符e以后的位置,由于两个字符串的字符e以后的地址发生重叠,我们的预期效果是“hhello”,但是结果为“hhhhhh”,根本原因是因为h字符拷贝到e字符时,h字符的指针覆盖掉e字符的指针,然后把e字符拷贝到l字符时,实际上e字符的指针经过第一次拷贝变成了h字符的指针,也就是l
字符的指针仍然是h字符的指针,依次进行下去就是“hhhhhh”。
        问题解决:
我们采用从右向左拷贝,这样拷贝过的字符就不会造成内存重叠引起的问题了。
        
//模拟memcpy
void* my_memcpy(void* dst, const void* src, int count)
{assert(dst != NULL);assert(src != NULL);if (count <= 0) {return NULL;}unsigned char* _dst = (unsigned char*)dst;unsigned char* _src = (unsigned char*)src;//right->leftif (_dst > _src && _dst < _src + count) {_src = _src + count - 1;_dst = _dst + count - 1;while (count) {*_dst = *_src;_dst--;_src--;count--;}}//left->rightelse {while (count) {*_dst = *_src;_dst++;_src++;count--;}}return dst;
}

C语言模拟实现memcpy函数相关推荐

  1. 用C语言模拟实现memcpy函数,memmove函数

    一. memcpy函数 void * memcpy ( void * destination, const void * source, size_t num ); 复制内存块 将num字节的值从源指 ...

  2. C语言--模拟实现strncpy函数

    C语言–模拟实现strncpy函数 一.strncpy说明 strncpy格式如下 char* strncpy(char* destination, const char* source, size_ ...

  3. 用C语言模拟实现字符函数与字符串函数

    用C语言模拟实现字符函数与字符串函数 strncat.strncpy.atoi 若使用本文相关代码,还请动手点个赞!!! #define _CRT_SECURE_NO_WARNINGS 1 #incl ...

  4. C语言中关于memcpy函数

    关于memcpy函数 **memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void destin, void source, unsigned n):函数的功能是从 ...

  5. c语言内存拷贝 memcpy()函数

    需包含头文件:C 标准库 - <string.h> 文章目录 描述 声明 参数 返回值 实例1 实例2 实例3:覆盖原有部分数据 描述 C 库函数 void *memcpy(void *s ...

  6. C语言之使用memcpy函数实现小数组数据不覆盖地复制到大数组

    我需要循环地将取到的N维字符数组依次存入大数组中. char total_str[102400] = {0}; char tmp_str[128] = {0}; memset(tmp_str,'\0' ...

  7. 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat

    用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...

  8. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  9. c语言memcpy函数源代码,memcpy函数-memcpy函数,C语言

    本教程分享:<memcpy函数>, memcpy是memorycopy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下:. void * memcpy ; .如 ...

最新文章

  1. asp.net 2.0中新增的AppendDataBoundItems .dropdownlist 添加第一项
  2. rabbitmq的整体架构一览
  3. Vue怎么将后台(springboot)中的图片显示到前端表格中
  4. maven 打包jar_Maven一定要会的这几个知识!
  5. 还在熬夜憋思路?这12篇最新论文打包送给你 | 本周值得读
  6. Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法
  7. lisp语言100以内勾股数_三个视频搞定:函数的最值、对勾函数、分式函数性质与图像、分段函数最值...
  8. 前端工作学习相关网站收集整理
  9. FTP服务器FileZilla Server配置及使用方法
  10. . NET多线程编程
  11. ASP.NET Core 2.1 开发跨平台应用教程
  12. Java Logging之JUL系列——Logger Hierarchy
  13. Git超详解七 储藏 (看不懂算我输)
  14. Windows Anaconda Pytorch pkgs安装 - 相关问题
  15. php,调用百地图度API实现标记
  16. 小蜜蜂商城系统解析,结合众筹卖货活动,流水千万
  17. pinctrl 子系统介绍
  18. XC3072锂电池充电IC(耐高压,带OVP,带防反接)
  19. 超市商品管理系统(课程设计)
  20. 产品3C认证在哪里办理

热门文章

  1. experiment-02-实验二 numpy的基本使用
  2. Shell之$(cd $(dirname $0); pwd)命令详解
  3. font-weight bold和bolder区别
  4. 【大话GSM】物理信道与逻辑信道映射详细解析
  5. 秋冬咳嗽不吃药 12款民间偏方巧止咳
  6. scipy.stats.norm函数
  7. 港科夜闻|香港科大(广州)(筹)校长倪明选教授出席亚洲大学联盟举行2022年校长论坛...
  8. 操作PNG图片的Chunks
  9. linux互联网远程控制,VNC远程控制LINUX 之一
  10. DataWhale组队打卡学习营task02-3