memcpy:复制给定的字符个数到目标位置
先来看memcpy的参数:
void *memcpy( void *dest, const void *src, size_t count );
第一个参数 dest 是目标位置的指针
第二个参数 src是要复制的字符位置的指针
第三个参数 count是要复制的字符个数
给个代码模拟实现memcpy的功能:
#define _CRT_SECURE_NO_WARNINGS 1
//模拟实现memcpy
#include<stdio.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
int i = 0;
while (i < count)
{
*((char*)dest + i) = *((char*)src + i);
i++;
}
}
int main()
{
char arr[20] = "ABCDEFGHIJKLMN";
my_memcpy(arr+5, arr, 7);
printf("%s", arr);
return 0;
}
运行结果如下:
我们可以发现结果好像不尽人意?
我们先上个图:
我们给的条件是dest >src的,而memcpy的功能会覆盖目标函数,而目标字符段和原字符段有重合部分,就会导致出现错误的结果
如何解决呢?
memmove可以解决这个问题:
void *memmove( void *dest, const void *src, size_t count );
我们发现memmove的参数和memcpy一样,只是功能有所差异。
memmove在复制前会判断目标字符段和原字符段是否有重叠,如果dest >src,那么memmove复制的顺序会从后往前,这样就不会造成丢失字符的情况。
模拟实现memmove的代码:
#define _CRT_SECURE_NO_WARNINGS 1
//模拟实现memmove
#include<stdio.h>
void* my_memmove(void* dest, void* src, size_t count)
{
if ((char*)dest - (char*)src > 0)
{
while (count > 0)
{
int i = 0;
*((char*)dest + count - 1) = *((char*)src + count - 1);
count --;
}
}
if ((char*)dest - (char*)src <= 0)
{
int i = 0;
while (i < count )
{
*((char*)dest + i) = *((char*)src + i);
i++;
}
}
}
int main()
{
char arr[20] = "acfunbilibili";
my_memmove(arr +4, arr, 6);
printf("%s", arr);
return 0;
}
运行结果如下: