对于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月前
|
安全 C++
内存函数 memcpy 和 memmove 的讲解和模拟实现
内存函数 memcpy 和 memmove 的讲解和模拟实现
29 0
|
1月前
|
编译器 C++
memmove函数和memcpy函数的模拟实现
memmove函数和memcpy函数的模拟实现
9 1
|
1月前
|
编译器 C++
C++中memcpy函数的实现
C++中memcpy函数的实现
|
3月前
带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)
带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)
|
4月前
|
存储 编译器 BI
内存函数​(memcpy、memmove、memset、memcmp)
内存函数​(memcpy、memmove、memset、memcmp)
|
4月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
53 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
6月前
|
存储 安全
memcpy和memmove函数的介绍和模拟实现
memcpy和memmove函数的介绍和模拟实现
|
9月前
|
编译器 C语言 C++
C进阶:内存函数memcpy, memmove, memcmp
C进阶:内存函数memcpy, memmove, memcmp
51 0
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。
|
11月前
|
存储 编译器 C语言
【C进阶】——内存操作函数memcpy、memmove、memcmp、memset详解及其模拟实现
【C进阶】——内存操作函数memcpy、memmove、memcmp、memset详解及其模拟实现
155 0