对于memcpy和memmove的区别,以及模拟实现memcpy和memmove

简介: 对于memcpy和memmove的区别,以及模拟实现memcpy和memmove

直接上源代码

对于memcpy和memmove来说其用法几乎一致所以在模拟实现时我分成了两份

第一份

对于memcpy来说在有一些编译器下并不会考虑重叠的情况即一下是不考虑重叠时候的代码:

void* my_memcpy(void* des, const void* sor, size_t num)
{
  assert(des && sor);
  void* ret = des;//该函数返回des的地址
  while(num--)
  {
    *((char*)des) = *((char*)sor);
    ++(char*)des;
    ++(char *)sor;
  }
  return  ret;
}

第二份

而有时候(vs环境IDE)的memcpy又会考虑重叠的情况所以此时的代码和memmove相同

void* my_memmove(void* des, const void* sor, size_t num)
{
  assert(des && sor);
  void* ret = des;//该函数返回des的地址
  if (des < sor)//从前往后将sor的前面开始放进des的前面
  {
    while (num--)
    {
      *((char*)des) = *((char*)sor);
      ++(char*)des;
      ++(char*)sor;
    }
  }
  else//des > sor 将sor从后往前放进des的后面
  {
    while (num--)//并且此处刚好num-- 指向正确的位置,否则还需要num-1
    {
      *((char*)des + num) = *((char*)sor + num);
    }
  }
  return  ret;
}
int main()
{
  char arr[] = "cdefgq";
  char arr1[] = "ab";
  //printf("%s\n",(char *)memmove(arr+3, arr+2,2));//第三个参数是以byte为单位的,但是不将\0拷贝进去、
  printf("%s", (char*)my_memmove(arr+3, arr+2, 2));
  return 0;
}

最后,对于memcpy的是否考虑重叠问题是不确定的所以在使用memcpy时有几个建议

  1. 在没有重叠问题时用memcpy,在有重叠时用memmove
  2. 或者直接摒弃memcpy,来只使用memmove
相关文章
|
6月前
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
109 2
|
4月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
6月前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
70 3
|
7月前
模拟实现memcpy,memmove,memset,memcmp
memcpy void * memcpy ( void * destination, const void * source, size_t num );
35 1
|
7月前
|
编译器 C++
memmove函数和memcpy函数的模拟实现
memmove函数和memcpy函数的模拟实现
31 1
|
7月前
带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)
带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)
|
7月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
257 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
存储 安全
memcpy和memmove函数的介绍和模拟实现
memcpy和memmove函数的介绍和模拟实现
|
编译器 C语言 C++
C进阶:内存函数memcpy, memmove, memcmp
C进阶:内存函数memcpy, memmove, memcmp
82 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。