memmove的实现与使用

简介: memmove的实现与使用

memmove与memcpy相比,可以实现同一数组的赋值

memmove要点

1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。

函数实现

void* my_memmove(void* dest, void* sor, size_t num)
{
  void* ret = dest;//纪录dest的初始地址
  //判断dest和sor的位置选这从前还是从后开始赋值
  if (dest < sor)
  {
    for (int i = 0; i < num; i++)
    {//memmove是按内存大小赋值,强转成char*后赋值,以免遗漏
      *(char*)dest = *(char*)sor;
      dest = (char*)dest + 1;
      sor = (char*)sor + 1;
    }
  }
  else
  {
    for (int i = num - 1; i >= 0; i--)
    {
      *((char*)dest+i )= *((char*)sor+i);
    }
  }
  return ret;
}

样例比较

#include <stdio.h>
#include <string.h>
void* my_memcpy(void* dest, void* sor, size_t num)
{
  void* ret = dest;//纪录dest的初始地址
  for (int i = 0; i < num; i++)
  {//memcpy是按内存大小赋值,强转成char*后赋值,以免遗漏
    *(char*)dest = *(char*)sor;
    dest = (char*)dest + 1;
    sor = (char*)sor + 1;
  }
  return ret;
}
void* my_memmove(void* dest, void* sor, size_t num)
{
  void* ret = dest;//纪录dest的初始地址
  //判断dest和sor的位置选这从前还是从后开始赋值
  if (dest < sor)
  {
    for (int i = 0; i < num; i++)
    {//memmove是按内存大小赋值,强转成char*后赋值,以免遗漏
      *(char*)dest = *(char*)sor;
      dest = (char*)dest + 1;
      sor = (char*)sor + 1;
    }
  }
  else
  {
    for (int i = num - 1; i >= 0; i--)
    {
      *((char*)dest+i )= *((char*)sor+i);
    }
  }
  return ret;
}
int main()
{
  int a[] = { 1,2,3,4,5,6,7,8,9,10 };
  int b[10] = { 0 };
  my_memcpy(b, a, 40);
  my_memmove(a+2, a,16);
  my_memcpy(b+2, b, 16);
  cout << "使用memmove的自赋值:";
  for (int i = 0; i < 10; i++)
    cout << a[i] << ' ';
  cout << "\n使用memcpy的自赋值:";
  for (int i = 0; i < 10; i++)
    cout << b[i] << ' ';
  //小端存储,赋17字节的内存就能吧a[4]赋值到b[4]
  return 0;
}

运行结果

目录
相关文章
|
7月前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
243 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)`。它比较指定字节数的内存,并根据比较结果返回整数值。
97 4
|
7月前
模拟实现memcpy,memmove,memset,memcmp
memcpy void * memcpy ( void * destination, const void * source, size_t num );
33 1
|
7月前
memmove内存拷贝函数
memmove内存拷贝函数
41 0
|
7月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
242 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
89 0
|
编译器 C语言 C++
C进阶:内存函数memcpy, memmove, memcmp
C进阶:内存函数memcpy, memmove, memcmp
79 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。
|
IDE 编译器 开发工具
对于memcpy和memmove的区别,以及模拟实现memcpy和memmove
对于memcpy和memmove的区别,以及模拟实现memcpy和memmove