一.memcpy
功能:从源内存地址起始位置拷贝若干个字节到目标地址中
void* my_memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
但是在拷贝重叠时则可能会出现错误:
例如:
int main()
{
char arr1[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
my_memcpy(arr1+2, arr1, 4);
cout << arr1 << endl;
return 0;
}
在这里我们想从arr1起始位置拷贝4个字节到arr1+2的位置
想要得到的结果是:1 2 1 2 3 4 7 8 9
而实际的结果为:
原因如下:
在拷贝过程中,由于src在dst左侧,因此src内容发生改变,引起错误
解决方法:memmove
二.memmove
功能:memmove用于拷贝字节,但是目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源内容会被更改
void* my_memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
if (dst <= src)
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}
运行结果:
memmove可以解决内存拷贝重叠引起的错误问题
- 当dst在src左侧或者在同一位置时,从前向后进行拷贝
- 其他情况则从后向前拷贝