memcpy和memmove两个函数比较相似,但在使用的时候有些区别
memcpy的作用是,把源src所指的内存的地址的起始位置开始拷贝n个字节到目标dest
所指的把内存地址的起始位置中
实现代码如下:
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
这段代码看似没什么问题,但是出现以下这种情况的时候结果就会出错
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memcpy(arr + 1, arr, 20);
return 0;
}
因为往同一块区域中拷贝的时候(arr)位置的内容会覆盖掉后面(arr+1)要拷贝的内容
所以,后面要拷贝的(arr+1)的内容是被(arr)覆盖掉的。
而memmove不会出现这种问题
实现代码如下:
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
因为,memmove可以从要拷贝的最后一个字节向前拷贝 所以不会造成覆盖。
两个函数各有优缺:
memcpy:代码比较简洁,运行时间比较少,在不会被覆盖的情况下编译起来比较快。
memmove:因为加入了判定,运行时间会比memmove慢,但是不容易出错。
有的编译器里两个函数实现代码一样