一,memcpy实现:
void* my_memcpy(void* dest, void* src, size_t n)
{
void* ret = dest;
assert(dest && src); //保证数据的有效性。
while (n--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
我们来分析一下:
1.函数参数类型时void*是因为我们不知道需要拷贝数据的具体类型。而void时无具体类型,可以接受任意类型的参数。
2.其中我们转换位char* 时char*解引用访问一个字节,以他位最小单位,就可以拷贝任意类型的数据了。
3.最后的返回值是为了保证链式访问,所谓链式访问其实就是一个函数的返回值可以作为另一个函数的参数。
二,memmove
memcpy最大的问题是如果自己对自己操作,又是会发生覆盖的问题从而导致结果出错,而memmove就是解决了这个问题。
void* my_memmove(void* dest,void* src,size_t n)
{
void* ret = dest;
//这里分情况时为了针对自己对自己。
assert(dest&&src);
if(dest<src)
{ //从前往后
while (n--)
{//注意强制类型转换都是临时的。
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{ //从后往前
dest = (char*)dest + n - 1;
src = (char*)src + n - 1;
while (n--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
分析:主要是通过从前往后拷贝和从后往前拷贝解决了自己给自己的覆盖问题。