memcpy与memmove的模拟实现
前言
memcpy与memmove的模拟实现
一、先看这两个函数在c++库中的定义
memcpy就是复制内存块
将数字字节的值从源指向的位置直接复制到目标所指向的内存块。
memmove就是移动内存块
将数字字节的值从源指向的位置复制到目标所指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。
memcpy与strcpy 有些相识 strcpy只能复制字符串 memcpy直接移动内存里的内容不管什么类型 同理memmove也是这样的
所以可以看见这两个函数参数和返回值都是void*
这两个函数都是在 string.h 头文件中的
二、看函数实际使用效果
#include<stdio.h>
#include<string.h>
int main()
{
int a[20] = { 1,2,3,4,5,6,7,8 }, b[20] = { 0 };
memcpy(b,a,20);
memmove(&a[5], &a[3], 20);
for (int i = 0; i < 20; i++)
{
printf("%d ", b[i]);
}
printf("\n");
for (int i = 0; i < 20; i++)
{
printf("%d ",a[i]);
}
return 0;
}
三、模拟实现
memcpy
void* my_memcpy(void*b,void*a,int n)
{
for (int i = 0; i < n; i++)
{
*((char*)b+i) =*((char*) a+i);
}
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8 }, b[10] = { 0 };
my_memcpy(b,a,20);
for (int i = 0; i < 10; i++)
{
printf("%d ", b[i]);
}
return 0;
}
memmove
void* my_memmove(char* b, char* a, int n)
{
if (a < b)
{
for (int i = n - 1; i >= 0; i--)
*((char*)b + i) = *((char*)a + i);
}
else if (a > b)
{
for (int i = 0; i < n; i++)
{
*((char*)b + i) = *((char*)a + i);
}
}
return b;
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8 }, b[10] = { 0 };
//my_memcpy(b,a,20);
my_memmove(a+2, a, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
注意目的内存与源内存可能会重合
源地址大于目的地址可采用从后往前开始移动