之前复习时模拟实现了关于字符串的一些操作,今天在之前的基础上完成memmove,memcpy两个对内存进行操作的函数
这是两个函数的原型:
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
两个函数都实现的是拷贝一定长度的内存的内容;
但是区别是当发生内存重叠的情况时,memmove可以保证拷贝的完整安全性,而memcpy不能保证拷贝结果的正确性。
因此我们只要在memcpy的代码上加上对内存重叠的处理就可以得到memmove
内存重叠的情况有两种,我们在这里进行简单的介绍:
情况一:
情况二:
由于第二种情况中使用memecpy拷贝的话就会因为内存重叠造成源字符串发生改变,因此我们要针对第二种情况下对memcpy进行优化。
void* my_memcpy(void* dest,const void* src, size_t count)
{
char* temp1 = (char*) dest;
char* temp2 = (char*) src;
while (count--)
{
*temp1++ = *temp2++;
}
return dest;
}
而在第二种情况下为了避免出现内存重叠,我们就要考虑为确保安全要加上限制条件:
1.dest > src 2. 重新定位dest和src的位置 3.分情况处理
void* my_memmove(void* dest,const void* src, size_t count)
{
char* temp1 = (char*) dest;
char* temp2 = (char*) src;
if (dest > src && ((src + count) > dest))
{
temp1 = temp1 + count - 1;
temp2 = temp2 + count - 1;
while (count--)
{
*temp1-- = *temp2--;
}
}
else
{
while (count--)
{
*temp1++ = *temp2++;
}
}
return dest;
}