memcpy和memmove的区别及实现

简介: memcpy和memmove的区别及实现

我们先上定义

image.png

编辑

作用:将 num 字节的值从source所指向的位置复制到destination所指向的内存块。

image.png

编辑

作用:将 num 字节的值从source所指向的位置复制到destination所指向的内存块。

image.png

编辑

作用:将 num 字节的值从source所指向的位置复制到destination所指向的内存块。复制站的内容和使用中间缓冲区一样时,允许destination和source重叠。

memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

我们用图来解释:

先用memcpy

image.png

编辑

在复制的过程source会和destination的一部分重叠并且覆盖掉destination的内容

下面memmove

image.png

两个对比的看在abc(de)这里发生了重叠,memmove的作用就是防止将重叠的部分覆盖,在拷贝的时候还在拷贝原来位置上对应的内容,而memcpy直接将其覆盖并且拷贝。

接下来我们实现两个函数

实现memcpy

void* my_memcpy(void* dst, const void* src, size_t cont)
{
  assert(dst);
  assert(src);
  void* ret = dst;
  while (cont--)
  {
    *(char*)dst = (*(char*)src);
    dst = ((char*)dst)++;
    src = ((char*)src)++;
  }
  return ret;
}

image.png编辑

这个是memcpy函数的结构

我们的思想是将每个比特位的内容都交换,这样可以做到对应num字节的内容交换,所以我们将dst和src强转为char*类型,这样每次我们可以选择一个比特位的内容进行操作交换,移动。(这里先要吧dst的首地址记录下来作为返回值)

实现memmove

image.png

编辑

void* my_memmove(void* dst, const void* src, size_t count)
{
    void* ret = dst;
    if (dst <= src || (char*)dst >= ((char*)src + count))
    {
        while (count--) {
            *(char*)dst = *(char*)src;
            dst = (char*)dst + 1;
            src = (char*)src + 1;
        }
    }
    else {
        dst = (char*)dst + count - 1;
        src = (char*)src + count - 1;
        while (count--) { 
            *(char*)dst = *(char*)src;
            dst = (char*)dst - 1;
            src = (char*)src - 1;
        }
    }
    return(ret);
}

这个是memmove的结构

思想和memcpy一样,注意的是重叠内容的处理,我们分为两种情况;

1.没有重叠内容

这种情况为  dst <= src || (char*)dst >= ((char*)src + count) 这样两部分不会重叠

2.重叠情况

这时候我们只需要反过来,倒着拷贝就可以了(仔细想一下)

image.png

以上就是memcpy的memmove的内容,欢迎在评论区留言共同进步!!!

相关文章
|
1月前
|
编译器 C++
C++中memcpy函数的实现
C++中memcpy函数的实现
|
3月前
|
算法 编译器 C语言
memcpy内存拷贝函数
memcpy内存拷贝函数
36 0
|
4月前
|
存储 编译器 BI
内存函数​(memcpy、memmove、memset、memcmp)
内存函数​(memcpy、memmove、memset、memcmp)
|
4月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
50 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
6月前
|
存储 安全
memcpy和memmove函数的介绍和模拟实现
memcpy和memmove函数的介绍和模拟实现
|
9月前
|
编译器 C语言 C++
C进阶:内存函数memcpy, memmove, memcmp
C进阶:内存函数memcpy, memmove, memcmp
51 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。
|
11月前
|
IDE 编译器 开发工具
对于memcpy和memmove的区别,以及模拟实现memcpy和memmove
对于memcpy和memmove的区别,以及模拟实现memcpy和memmove
|
11月前
|
存储 编译器 C语言
【C进阶】——内存操作函数memcpy、memmove、memcmp、memset详解及其模拟实现
【C进阶】——内存操作函数memcpy、memmove、memcmp、memset详解及其模拟实现
152 0