C语言:memcpy、memmove等函数的了解,使用以及实现

  • 1、memcpy函数的介绍,使用,以及实现
  • 2、memmove函数的介绍,使用,以及实现

1、memcpy函数的介绍,使用,以及实现

  • 1、作用介绍

函数原型:void * memcpy ( void * destination, const void * source, size_t num );
memcpy是memory copy的缩写,意为内存复制,memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来
如果source和destination有任何的重叠,复制的结果都是未定义的。

  • 2、函数使用
#include<stdio.h>
#include <ctype.h>
#include<assert.h>
int main()
{float arr1[] = { 1.0f,2.0f,3.0f,4.0f };float arr2[5] = { 0.0 };memcpy(arr2, arr1, 8);//只复制8个字节int i = 0;for (i = 0; i < 3; i++){printf("%lf", arr2[i]);}return 0;
}

运行结果:

  • 3、函数模拟实现
#include<stdio.h>
#include <ctype.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{void* ret = dest;assert(dest&&src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;//void*强制类型转换为char*每加一往后移动一个字节src = (char*)src + 1;}return ret;
}
int main()
{int num = 20;//只复制20个字节int a[] = {1,2,5,3,5,6,7,9,10};int b[20];my_memcpy(b,a,num);int i = 0;for (i = 0; i <5; i++){printf("%d ", b[i]);}return 0;
}

运行结果:

2、memmove函数的介绍,使用,以及实现

  • 1、memmove的介绍

函数原型:void * memmove ( void * destination, const void * source, size_t num );
此函数和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠(此处模拟实现函数时会有代码说明),就得使用memmove函数处理。

  • 2、memmove的使用
#include<stdio.h>
#include <ctype.h>
//#include<assert.h>
int main()
{char str[] = "memmove can be very useful";//此处将str字符串向后偏移5个字符位置后面的10个字符整个移动到了从str偏移10个字节的位置memmove(str + 10, str + 5, 10);//str+5 为首地址向后移动五个字节位置puts(str);//这里输出结果就为将ve can be 放置到ca后,ca后的十个字符被覆盖return 0;
}

运行结果:

  • 3、memmove的模拟实现

从函数运行结果可知,memmove函数实则为在一个字符串上的复制(在一个内存段内进行操作),
所以在复制时就会在空间上重叠的问题,这时候用一些操作手法来处理也就是memmove函数了。

源地址在前,目标地址在后:
如图所示将1234复制到3456时,需要从后往前赋值,先用4给到6的空间,再给3到5,依次下去,
如果不是这样赋值,从前往后的话,先给1到3的空间,2给到4的空间,则后面3和4已经被覆盖掉了没有值给到6和7的空间。
还有源地址在后,目标地址在前的情况,一样推理。

#include<stdio.h>
//#include<string.h>
//#include <ctype.h>
#include<assert.h>void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);if (dest < src)//当目标地址在源地址前,采用从前往后的方式一个一个字节赋值,否则会覆盖掉重叠空间的值。{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else//当目标地址在源地址后,采用从后往前的方式一个一个字节赋值,否则会覆盖掉重叠空间的值。{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 + 2, arr1, 16);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

运行结果:

C语言:memcpy、memmove等函数的了解,使用以及模拟实现相关推荐

  1. C语言 memcpy 和 strcpy 函数区别 - C语言零基础入门教程

    目录 一.memcpy 函数/strcpy 函数简介 二.memcpy 函数/strcpy 函数实战 1.strcpy 函数属于字符串拷贝 2.memcpy 函数属于内存拷贝 三.猜你喜欢 零基础 C ...

  2. 《strcmp,strcpy,memcpy,memmove等函数模拟实现》

    模拟实现常见字符串函数比如:strcmp,strcpy,memcpy,memmove等函数 1.模拟实现memcpy函数 2.模拟实现memmove函数 3.模拟实现strstr函数 4.模拟实现st ...

  3. perm函数c语言_理解C语言(三) 字符串处理函数

    1 字符串基础 字符串是一种重要的数据类型,有零个或多个字符组成的有限串行. 定义子串: 串中任意个连续的字符组成的子序列,并规定空串是任意串的子串,任意串也是其自身的子串,如字符串"ade ...

  4. C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)

    内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...

  5. C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove

    模拟实现字符串和内存操作函数(二)目录: strncpy strncat strncmp strcmp memcpy memmove strncpy char* strncpy(char* dst, ...

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

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

  7. 自己实现内存操作函数memset(),memcmp(),memcpy(),memmove()

    1.memset()内存设置函数(初始化) void *my_memset(void* dest, int c, size_t count) { assert(dest != NULL); char  ...

  8. C语言 memcpy 函数 - C语言零基础入门教程

    目录 一.memcpy 函数简介 二.memcpy 函数实战 1.memcpy 函数简单使用 2.strcpy 函数属于字符串拷贝 3.memcpy 函数属于内存拷贝 4.memcpy 函数注意崩溃问 ...

  9. c语言memcpy是什么,C语言memcpy函数的用法

    介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...

最新文章

  1. ConcurrentHashMap介绍
  2. SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)
  3. Qt for VxWorks
  4. hihocoder #1465 : 后缀自动机五·重复旋律8
  5. 访问Access数据库需要注意的问题
  6. Docker 是一个开源的应用容器引擎
  7. 森林病虫防治系统 (十)
  8. 《统计学习方法》—— 信息增益、决策树算法(ID3,C4.5)以及python3实现
  9. python输出间隔_在python中生成间隔之间的月份列表
  10. 通过Rman catalog 创建及管理Oracle数据库备份
  11. JavaScript实现消消乐-源代码
  12. 小米路由器4a开发版固件_小米路由器 4A 刷入lean 的 openwrt/lede
  13. jemalloc 内存管理
  14. PostgreSQL全文检索
  15. 华为云数据库GaussDB(for openGauss):初次见面,认识一下
  16. 干法:经营者应该怎样工作
  17. Linux:理论 面试
  18. java gsoap mtom_mtom_xop 通过gsoap实现高效MTOM协议的数据传输 - 下载 - 搜珍网
  19. 第八章 VAR模型与脉冲响应
  20. 黑客入侵Wishbone窃取上万邮箱及手机号码

热门文章

  1. ps2022 - add text
  2. 京东数科铁路巡检机器人 亮相2019上海国际先进轨道交通展
  3. libsvm的安装和使用【转载】
  4. 使用java代码增加一点博客访问量
  5. sdut oj 3474 汤圆の拯救计划
  6. 没有计算机背景能申BA吗,申请美国大学ba研究生需要满足哪些条件?
  7. DCGAN---生成动漫头像
  8. 文章伪原创工具-自动批量文章伪原创工具免费
  9. 论文:Object-Centric process Mining Dealing With Divergence and Convergence in Event Data翻译
  10. 【python】Romantic Rose(玫瑰三号)