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); ```
248 6
|
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)`。它比较指定字节数的内存,并根据比较结果返回整数值。
99 4
|
7月前
模拟实现memcpy,memmove,memset,memcmp
memcpy void * memcpy ( void * destination, const void * source, size_t num );
33 1
memmove的实现与使用
memmove的实现与使用
98 0
|
7月前
|
C语言
memcpy不适用的场景
memcpy不适用的场景
|
7月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
249 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
memcpy的使用与实现
memcpy的使用与实现
110 0
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
89 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。