目录

memcpy内存拷贝函数

memmove函数

memcmp函数介绍

memset内存设置函数


memcpy内存拷贝函数

memcpy是内存拷贝函数,从源字符串src所指向的起始位置,拷贝到目标字符串dest的起始位置中。从src拷贝n个字节的起始位置地址到目标dest的起始位置地址。与strcpy不一样,memcpy可以拷贝任何数据,整形,字符等。而strcpy只能拷贝字符串。

  • 1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
  • 2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
  • 注意:source和destin都不一定是数组,任意的可读写的空间均可

来源于:memcpy函数的使用方法 - elegang - 博客园

memcpy会发生内存区域的重叠,如果想要处理重叠则可以使用memmove。

strcpy和memcpy主要有以下3方面的区别。

1、复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

memcpy的模拟实现

void* my_memcpy(void* dest,const void* src,size_t num)
{void* ret = dest;assert(dest && src);while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
int main()
{//实现memcpyint arr1[10] = { 1,2,3,4,5,6,7,8,9 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 5 * sizeof(int));int i = 0;for (i = 0; i < 5; i++) {printf("%d ", arr2[i]);}
}

memmove函数

与memcpy类似,memmove可以处理重叠问题。

如果目标区域和源区域有重叠的话:
memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

来源:memcpy memmove区别和实现 - 可可西 - 博客园

memmove模拟实现

我们可以发现当dest>src的时候,从后往前移动,当dest<src的时候从前往后

我们分别举个例子

当dest>src

当dest<src

//memmove模拟实现
void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;//src<dest 从后往前assert(dest && src);if (dest > src){while (num--){*((char*)dest + num) = *((char*)src + num);}}//src>dest从前往后else{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}return ret;
}

memcmp函数介绍

memcmp是内存比较函数是比较每一个字节的大小。

memset内存设置函数

 memset函数的使用

int main()
{char str[] = "hello,csdn";memset(str, '$', 5);printf("%s", str);return 0;
}

将str的前5个字符全部换成$

这里如果改变的是数字的话只改变每一个字节。

memcpy,memmove,memcmp,memset内存函数相关推荐

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

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

  2. c/c++内存函数(memcpy,memmove,memset,memcmp)的详解和自已实现

    1.mempy指的是C和C++使用的内存拷贝函数, 函数原型为void* memcpy(void* destin, void* source, unsigned n): 函数的功能是从源内存地址的起始 ...

  3. 【C语言】memcmp、memcpy、memmove、memset、memchr函数详解

    目录 一.综述 二.介绍 1.memcmp 2.memcpy 3.memmove 4.memset 5.memchr 一.综述 memcmp.memcpy.memmove.memset.memchr都 ...

  4. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

  5. (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.内存函数是什么 二.内存函数的分类(常见) 1.memcpy memcpy的模拟实现 2.memmove memmov ...

  6. 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串

    char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n) ...

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

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

  8. 从memcpy到memmove,内存函数拷贝与内存重叠问题(重点内容)

    有一个关于拷贝的问题,假如有这样一个字符串 char a[]="hello"; 我需要把这个字符串拷进另一个变量中 char a1[10]; 好像方法蛮多的,比如strcpy #d ...

  9. C和指针之字符串memcpy、memmove、memset使用总结

    1.介绍memcpy.memmove.memset 1) void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开 ...

最新文章

  1. 2015大型互联网公司校招都开始了,薪资你准备好了嘛?
  2. Programming Computer Vision with Python (学习笔记十一)
  3. 【GAN优化外篇】详解生成模型VAE的数学原理
  4. Leaflet中通过setZIndex实现图层层级控制
  5. Android开发之系统信息——获取Android手机中SD卡内存信息
  6. Idea 插件 lombok 的安装和使用
  7. 学考语言成绩c对高考有影响吗_三大影响!考生务必上心,最近正在进行的学考对升学很重要...
  8. POJ 1192 最优连通子集(树形DP)
  9. VC9.VC10.VC11...各对应什么版本的VS,以及含义
  10. 微信小程序:强大的多功能图片处理器
  11. 基于Java的实现宠物管理系统的设计与实现
  12. 使用影子系统后win10导致的蓝屏解决办法
  13. 设置背景图片大小的方法
  14. 计算机组成原理中men,东北大学秦皇岛分校计算机组成原理课程设计.doc
  15. DIY强大的虚拟化环境-规划思路框架
  16. VS2015 scanf 函数报错 error C4996: 'scanf'
  17. Android 第三方QQ分享功能实现
  18. 攻防实战:如何检测或优化内存中的.NET Tradecraft
  19. 初学C语言的一点自我拙见
  20. Android Socket IQ聊天软件 之 聊天气泡编码步骤讲解

热门文章

  1. tortoisesvn的版本冲突
  2. 证券交易的量化接口的用途?
  3. 算法的优劣评估选择-常用方法
  4. GlobalObject::CollectGarbage Method
  5. 哇...简洁的桌面时间屏保(30秒搞定)
  6. 御龙在天手游怎么不显示服务器了,御龙在天手游经验怎么找回 等级不掉队方法解析...
  7. Apache APISIX 集成 HashiCorp Vault,生态系统再添一员
  8. 我所学到的EC-3(个人学习总结,不能保证正确,欢迎大佬指正)
  9. 丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
  10. toString与valueOf区别