模拟实现memcpy、memmove

本文详细介绍了如何手动实现C语言中的memcpy和memmove函数。memcpy用于非重叠内存区域的数据复制,而memmove则能处理源和目标内存可能重叠的情况。文章通过具体代码示例展示了这两种函数的实现过程及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【1、问题描述】

模拟实现memcpy,函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

【问题重点】

1、函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,这个函数在遇到’\0’的时候并不会停下来。

2、在具体的函数实现过程中,思路很简单,类似于字符拷贝就可以完成,但有一个问题就是类型,memcpy函数默认的返回值是void*类型,不能直接使用pdest[i] = psrc[i]来拷贝,在这之前我们要先进行类型的强制转换。

【实现代码】

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void* Memcpy(void* dest, const void* src, size_t num) {
  assert(dest != NULL);
  assert(src != NULL);
  const char* psrc = (const char*)src;
  char* pdest = (char*)dest;
  for (size_t i = 0; i < num; ++i) {
   pdest[i] = psrc[i];
  }
  return dest;
}
int main() {
  int arr1[4] = { 0 };
  int arr2[4] = { 1,2,3,4 };
  Memcpy(arr1, arr2, 16);//单位是字节,所以不能填4
  for (int i = 0; i < 4; ++i) {
   printf("%d ", arr1[i]);
  }
  system("pause");
  return 0;
}

【运行结果】
在这里插入图片描述
【2、问题描述】

模拟实现memmove

【问题重点】

我们知道memcpy与memmove的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的,在两个内存块重叠的情况下,应该怎样处理这一情况下的拷贝?
在内存没有重叠的时候,我们按照memcpy的方式进行拷贝,而有重叠的时候,我们反过来,从源内存块上的最后一个位置开始依次往前拷贝,即可解决问题,因此我们只需要先判断内存重叠情况,if (pdest<psrc || pdest>psrc + num),若满足就从前往后拷贝,否则从后往前拷贝。

【实现代码】

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void* Memmove(void* dest, const void* src, size_t num) {
  assert(dest != NULL);
  assert(src != NULL);
  const char* psrc = (const char*)src;
  char* pdest = (char*)dest;
  if (pdest<psrc || pdest>psrc + num) {//判断是否存在内存重叠情况
   for (size_t i = 0; i < num; ++i) {
    pdest[i] = psrc[i];
   }
  }
  else {
   for (size_t i = num; i > 0; --i) {
    pdest[i] = psrc[i];
   }
 }
  return dest;
}
int main() {
  char str[] = "memmove can be very useful......";
  Memmove(str + 20, str + 15, 11);
  puts(str);
  system("pause");
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值