面试中如问到memcpy的实现,那就要小心了,这里有陷阱。
主要是内存重叠问题,和char *转换问题
强制转换为char型指针,内存就知道如何移动
void* Memcpy(void* dst, const void* src, size_t count)
{
char *pdst = (char*)dst;
char *psrc = (char*)src;
if (NULL == dst&&NULL == src)
{
return NULL;
}
if ( pdst>psrc && pdst< psrc + count)//从后往前复制
{
pdst = pdst + count-1;
psrc = psrc + count-1;
while (count--)
{
*pdst-- = *psrc--;
}
}
else
{
for (size_t i=0; i < count;i++)
{
*pdst++ = *psrc++;
}
}
return dst;
}
strcpy防止内存重叠
char str[100] = { 0 };
strncpy(str, "abcdefghi", 100 - 1);
cout << str << endl;
char szTemp[100] = { 0 };
strncpy(szTemp, str, sizeof(szTemp) - 1);
strcpy(str + 2, szTemp); // 这里是示意, 防止越界啊
cout << str << endl;
return 0;
主要是内存重叠,解决方法,反向拷贝。
网友评论