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的内容,欢迎在评论区留言共同进步!!!

相关文章
|
7月前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
6月前
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
109 2
|
7月前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
258 6
|
2月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
79 0
|
4月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
7月前
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
103 4
|
7月前
模拟实现memcpy,memmove,memset,memcmp
memcpy void * memcpy ( void * destination, const void * source, size_t num );
35 1
|
7月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
257 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
编译器 C语言 C++
C进阶:内存函数memcpy, memmove, memcmp
C进阶:内存函数memcpy, memmove, memcmp
80 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。