【C语言】memcpy和memmove模拟实现

简介: 头文件:string.h

头文件:string.h


memcpy

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

功能:函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

返回值:返回dest。

这个函数在遇到 ‘\0’ 的时候并不会停下来

如果source和destination有任何的重叠,复制的结果都是未定义的

模拟实现

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, unsigned int num)//传入数据可能是各种类型的,所以用void*接收

20210217154133371.png

{
    //断言,判断指针的有效性,防止野指针
    assert(dest!=NULL);
    assert(src!=NULL);
  //void*
  //可以接收所有类型的指针
  //不可以进行解引用和加减整数的操作,但可以比较大小
  void* tmp = dest;
  while (num--)
  {
  //把指针类型转化为char*在解引用和+1/-1时可以访问一个字节
  *(char*)dest = *(char*)src;
  ((char*)dest)++;
  ((char*)src)++;
  }
  return tmp;
}
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "123456";
  printf("arr1=%s\n", (char*)my_memcpy(arr1, arr2, 3));//把arr2的前三个字节内容拷贝到arr1里
  return 0;
}

20210217154133371.png

memmove

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


功能: 函数memmove从source的位置开始向后复制num个字节的数据到destination的内存位置


返回值: 返回dest


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

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

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, unsigned int num)
{
  //断言,判断指针的有效性,防止野指针
  assert(dest != NULL);
  assert(src != NULL);
  //对于重叠拷贝
  //若dest<src,src从前向后拷贝
  //若dest>=src&&dest<=src+num,src从后向前拷贝
  //若dest>src,src从前和从后都可以拷贝
  void* tmp = dest;
  while (num--)
  {
  if (dest < src)//从前向后拷贝
  {
    *(char*)dest = *(char*)src;
    ++(char*)dest;
    ++(char*)src;
  }
  else//从后向前拷贝
  {
    *((char*)dest + num) = *((char*)src + num);
    --(char*)dest;
    --(char*)src;
  }
  }
  return tmp;
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int n = sizeof arr/sizeof arr[0];
  int* ret=(int*)(my_memmove(arr, arr + 2, 20));//把34567拷贝到12345上
  int i = 0;
  for (i = 0; i < n; i++)
  {
  printf("%d ", *ret);
  ret++;
  }
  return 0;
}

20210217163153486.png

相关文章
|
23天前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
51 0
|
9月前
|
C语言
【C语言】memcpy函数和memmove函数使用和模拟实现
【C语言】memcpy函数和memmove函数使用和模拟实现
48 0
|
23天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
11天前
|
C语言
C语言实现memcpy,memmove
C语言实现memcpy,memmove
18 0
|
11月前
|
存储 C语言
【C语言】memcpy , memset等内存操作函数使用方法与注意事项
【C语言】memcpy , memset等内存操作函数使用方法与注意事项
120 0
|
11月前
|
存储 安全 编译器
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
|
23天前
|
C语言
C语言第五十六弹---模拟使用memcpy函数
C语言第五十六弹---模拟使用memcpy函数
|
23天前
|
C语言
C语言零基础教程(memset,memcpy函数,memmove函数)
C语言零基础教程(memset,memcpy函数,memmove函数)
38 0
|
10月前
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
50 0
|
C语言
C语言中基础(有关数据拷贝的函数,例:strcpy,strncpy,memcpy,memove库函数的实现和应该注意的小细节)
C语言中基础(有关数据拷贝的函数,例:strcpy,strncpy,memcpy,memove库函数的实现和应该注意的小细节)