本文模拟实现c内存函数memcpy和memmove函数,在实现原理上两个函数略有不同,memcpy不能处理重叠内存的拷贝,memmove函数可以处理重叠内存的拷贝。
函数1:memcpy
memcpy函数原型为:void *memcpy( void *dest, const void *src, size_t count );
参数1:dest为目的地空间起始地址
参数2:src为源空间起始地址
参数3:count为拷贝字节数
函数作用就是把原空间的count个字节数拷贝到目的地空间
例如:把arr数组里面5个int元素拷贝到arr2里面:
运行结果:
具体实现代码:
只需要一个字节一个字节的拷贝就可以,把void* 强转成char*
void* my_memcpy(void* dest, const void* src, int count)
{
void* ret=dest;
while(count--)
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
return ret;
}
函数2:memmove
memmove函数原型为:void *memmove( void *dest, const void *src, size_t count );
参数1:dest为目的地空间起始地址
参数2:src为源空间起始地址
参数3:count为拷贝字节数
函数作用就是把原空间的count个字节数拷贝到目的地空间,但是可以处理重叠内存拷贝
例如:在数组内部拷贝6个int数据,如下图所示:
情况1运行结果:
情况2运行结果:
具体实现代码:
void* my_memmove(void* dest, const void* src, int count)
{
void* ret=dest;
if(dest<src)
{
while(count--)
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
}
else
{
while(count--)
{
*((char*)dest+count)=*((char*)src+count);
}
}
return ret;
}