主要是要注意当目标地址在源地址后面且存在重叠区域的时候,需要从后往前复制
#include <bits/stdc++.h>
using namespace std;
void MyMemCpy(void *dst, void *src, int len)
{
if (dst > src && dst < src + len)
{
/*
src dst src+n dst+n
|____|_______|_______|
*/
char *srcTmp = (char *)(src) + len - 1;
char *dstTmp = (char *)(dst) + len - 1;
while (len--)
{
*(dstTmp--) = *(srcTmp--);
}
}
else
{
char *srcTmp = (char *)(src);
char *dstTmp = (char *)(dst);
while (len--)
{
*(dstTmp++) = *(srcTmp++);
}
}
return;
}
void TestCase1()
{
char testSrc[40]("123456789");
char *testDst = testSrc; // 测试重叠部分
MyMemCpy(testDst, testSrc + 3, 6);
cout << "answer:"
<< "456789789" << endl;
cout << "my answer:" << testDst << endl;
}
void TestCase2()
{
char testSrc[40]("123456");
char *testDst = testSrc + 3; // 测试重叠部分
MyMemCpy(testDst, testSrc, 6);
cout << "answer:"
<< "123456" << endl;
cout << "my answer:" << testDst << endl;
}
int main(int argc, char const *argv[])
{
TestCase1();
TestCase2();
return 0;
}
结果:
answer:456789789
my answer:456789789
answer:123456
my answer:123456