【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

相关文章
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
309 0
|
8月前
|
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
3月前
|
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
103 0
|
7月前
|
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
80 3
C语言memcpy()函数用法
C语言memcpy()函数用法
|
8月前
|
C语言实现memcpy,memmove
C语言实现memcpy,memmove
67 0
【C语言】memmove()函数(拷贝重叠内存块函数详解)
【C语言】memmove()函数(拷贝重叠内存块函数详解)
117 1
|
11天前
|
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
49 23

热门文章

最新文章