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. 编程 25 年后,现实将我打回菜鸟程序员的起点
  2. [Drupal] How to display the month in French words.
  3. Egret之JSZip高级应用:压缩JS
  4. python中unique_一个神奇的Python机器学习交互应用开放框架
  5. 驰骋工作流引擎表单设计控件-字段类控件(2)
  6. 面向对象的几大设计原则
  7. jquery html 片段,十条jQuery代码片段助力Web开发效率提升
  8. c++ map 自定义排序_Java学习笔记:Map集合介绍
  9. 编译器错误~System.Data.Objects.DataClasses.EntityObject在未被引用的程序集中定义
  10. linux服务器MQ组件报警,服务器 有哪些告警
  11. Android build.gradle文件详解(转述自《Android第一行代码》第二版)
  12. [原]ActiveReport6 for net使用(一)
  13. adb 静默安装_GitHub - anricheng/jing_install: 静默安装与卸载
  14. 科学计算机怎样开根号,电脑上的科学计算器怎么开根号(科学计算器开4次方根操作方法)...
  15. checksum计算方法
  16. MFC——EDIT空间显示内容大小限制在32K,如何解除?
  17. CUDA:使用CUFFT来合成和 实时渲染海洋表面实例
  18. 全排列牛客和L46,L47
  19. 电脑摄像头未能创建连接服务器,电脑提示未能创建视频预览,请检查设备连接的原因及解决办法...
  20. uva 672 - Gangsters(dp)

热门文章

  1. 近年来发生的代码泄露事件
  2. 过秦论-贾谊(西汉)
  3. 聚力远航·共创辉煌|沃丰科技受邀参加华为中国生态大会2021
  4. 马云怒怼阿尔法狗,称搞阿尔法狗没意义,人工智能的意义在哪?
  5. 有关于ipconfig查出来的地址和百度ip地址不同的解析
  6. win2012文件服务器添加角色,win2012系统无法添加角色处理教程
  7. vue-awesome-swiper优化使用
  8. LVDS差分信号深度详解
  9. docker安装Yearning MYSQL SQL语句审核平台
  10. 我让人工智能写个python小游戏-玩起来了