c memcpy 带重叠部分 实现

主要是要注意当目标地址在源地址后面且存在重叠区域的时候,需要从后往前复制

#include 

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

你可能感兴趣的:(c语言,c++,开发语言)