目录
memcpy
声明
void *memcpy(void *dest, const void *src, size_t count)
描述
将src中的count个字节复制到dest中(dest与src可以是任意类型)。
模拟实现
void* my_memcpy(void*dest,const void*src,int count)
{
arrest(dest&&src);
char* p1 = dest;
char* p2 = src;
while (count--)
{
*p1++ = *p2++;
}
return dest;
}
缺点
该函数只能解决内存不重叠的问题,若遇到内存重叠就需要用到memmove
memmove
声明
void *memmove(void *dest, const void *src, size_t count)
描述
与memcpy相同的地方是可以将src中的count个字节复制到dest中,但是memmove的功能更加强大,内存重叠与内存不重叠的问题它都可以解决。
模拟实现
图解
(1)src在dest的前面(src<dest)
将1 2 3 4复制到4 5 6 7的位置上,若按照1 -> 4 2->5 3->6 4->7 这样从前到后的顺序,到要复制4的时候会发现,4的位置上已经不再是4,而是1,这样复制就有问题。
这时,我们就需要从后往前的顺序复制。按照4->7 3->6 2->5 1->4这样顺序就不会有问题了。
(2)src在dest的后面(src>dest)
此时如果继续按照从后往前就会出现问题,这就需要我们从前往后复制。
代码实现
void* my_memmove(void* dest, const void* src, int count)
{
assert(dest&&src);
char* p1 = dest;
char* p2 = src;
if (src > dest)
{
while (count--)
{
*p1++ = *p2++;
}
}
else
{
while (count--)
{
*(p1 + count) = *(p2 + count);
}
}
}