模拟实现memcpy时的内存覆盖问题
发现问题
如果不考虑内存覆盖问题,将会出现以下情况:
void* my_memcpy(void* destination, const void* source, size_t num)
{
assert(destination != NULL && source != NULL);
char* pdest = (char*)destination;
const char* psour = (const char*)source;
while (num--)
{
*pdest++ = *psour++;
}
return destination;
}
void main()
{
char str[10] = "012345678";
char* pstr = my_memcpy(str+2,str,4);
printf("%s\n", str);
}
上述代码所出现的情况,主要原因如下:
对于同一个字符串来说,source所指向的位置在destination的前面,并且需要拷贝(替换)的内容包含了destination指向及指向之后的内容,所以当开始拷贝的时候,destination所指向的空间内容已经被覆盖掉,这也就造成所得到的结果和预期的不大一样。
问题解决
处理方法如下:
void* my_memcpy(void* destination, const void* source, size_t num)
{
assert(destination != NULL && source != NULL);
char* pdest = (char*)destination;
const char* psour = (const char*)source;
if (psour < pdest && (psour + num) > pdest)
{
pdest = pdest + num - 1;
psour = psour + num - 1;
while (num-->0)
{
*pdest-- = *psour--;
}
}
else
{
while (num-->0)
{
*pdest++ = *psour++;
}
}
return destination;
}
void main()
{
char str[10] = "012345678";
char* pstr = my_memcpy(str + 2, str, 4);
printf("%s\n", str);
}
|