【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

相关文章
|
6月前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
198 0
|
6月前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
66 0
|
5月前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
65 3
|
5月前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法
|
6月前
|
C语言
C语言实现memcpy,memmove
C语言实现memcpy,memmove
53 0
|
6月前
|
存储 前端开发 编译器
【C语言】memmove()函数(拷贝重叠内存块函数详解)
【C语言】memmove()函数(拷贝重叠内存块函数详解)
100 1
|
6月前
|
C语言
C语言第五十七弹---模拟使用memmove函数
C语言第五十七弹---模拟使用memmove函数
|
6月前
|
C语言
C语言第五十六弹---模拟使用memcpy函数
C语言第五十六弹---模拟使用memcpy函数
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3