memcpy与memmove

简介: memcpy与memmove


目录

memcpy

声明

描述

模拟实现

缺点

memmove

声明

描述

模拟实现

图解

代码实现


memcpy

声明

void *memcpy(void *dest, const void *src, size_t count)

描述

将src中的count个字节复制到dest中(dest与src可以是任意类型)。

模拟实现

void* my_memcpy(void*dest,const void*src,int count)
{
    arrest(dest&&src);
  char* p1 = dest;
  char* p2 = src;
  while (count--)
  {
    *p1++ = *p2++;
  }
  return dest;
}

缺点

该函数只能解决内存不重叠的问题,若遇到内存重叠就需要用到memmove

memmove

声明

void *memmove(void *dest, const void *src, size_t count)

描述

与memcpy相同的地方是可以将src中的count个字节复制到dest中,但是memmove的功能更加强大,内存重叠与内存不重叠的问题它都可以解决。

模拟实现

图解

(1)src在dest的前面(src<dest)

 将1 2 3 4复制到4 5 6 7的位置上,若按照1 -> 4     2->5    3->6     4->7  这样从前到后的顺序,到要复制4的时候会发现,4的位置上已经不再是4,而是1,这样复制就有问题。

 这时,我们就需要从后往前的顺序复制。按照4->7    3->6    2->5     1->4这样顺序就不会有问题了。

(2)src在dest的后面(src>dest)

此时如果继续按照从后往前就会出现问题,这就需要我们从前往后复制。

代码实现

void* my_memmove(void* dest, const void* src, int count)
{
    assert(dest&&src);
  char* p1 = dest;
  char* p2 = src;
  if (src > dest)
  {
    while (count--)
    {
      *p1++ = *p2++;
    }
  }
  else
  {
    while (count--)
    {
      *(p1 + count) = *(p2 + count);
    }
  }
}
相关文章
|
7月前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
255 6
|
4月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
7月前
模拟实现memcpy,memmove,memset,memcmp
memcpy void * memcpy ( void * destination, const void * source, size_t num );
35 1
memmove的实现与使用
memmove的实现与使用
99 0
|
7月前
|
C语言
memcpy不适用的场景
memcpy不适用的场景
|
7月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
254 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
memcpy的使用与实现
memcpy的使用与实现
110 0
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
91 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。
|
IDE 编译器 开发工具
对于memcpy和memmove的区别,以及模拟实现memcpy和memmove
对于memcpy和memmove的区别,以及模拟实现memcpy和memmove