一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

1.与字符串函数strcpy区别:

  • memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
  • memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。

2.函数说明:         

  1. memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
  2. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

3.拷贝情况:

      拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:

      1.当src内存区域和dst内存区域完全不重叠

2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前

 3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前

 

     上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

4.代码实现

memcpy:

复制代码
 1 void* _memcpy(void* dest, const void* src, size_t count)
 2 {
 3     assert(src != nullptr&&dest != nullptr);
 4     //判断dest指针和src指针是否为空,若为空抛出异常
 5     char* tmp_dest = (char*)dest;
 6     const char* tmp_src = (const char*)src;
 7     //将指针dest和指针src由void强转为char,
 8     //使得每次均是对内存中的一个字节进行拷贝
 9     while (count--)
10         *tmp_dest++ = *tmp_src++;
11     return dest;
12 }
复制代码

memmove:

复制代码
 1 void* _memmove(void* dest, const void* src, size_t count)
 2 {
 3     assert(src != nullptr&&dest != nullptr);
 4     //判断dest指针和src指针是否为空,若为空抛出异常
 5     char* tmp_dest = (char*)dest;
 6     const char* tmp_src = (const char*)src;
 7 
 8     if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝
 9         while (count--)
10             *tmp_dest++ = *tmp_src++;
11     else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝
12     {
13         tmp_src += count - 1;
14         tmp_dest += count - 1;
15         while (count--)
16             *tmp_dest-- = *tmp_src;
17     }
18     //else(tmp_src==tmp_dest) 此时不进行任何操作
19     return dest;
20 }
复制代码

 

posted on   一杯清酒邀明月  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示