关于复现strcpy中的问题

如题,在准备面试的时候发现好多网上复现strcpy时其代码会有如下一步:

 char* MyStrcpy(char *pDst, const char* pSrc)
{
    if (nullptr == pSrc)
    {
        return nullptr;
    }
    if (pDst == pSrc)
    {
        return pDst;
    }
    pDst = (char *)malloc(strlen(pSrc) + 1);
    //char *p = pDst;
    //while ((*p++ = *pSrc++) != '\0'); 
    while (*pSrc != '\0')
    {
        *pDst = *pSrc;
        *pDst++;
        *pSrc++;
    }
    *pDst = '\0';
    return pDst;
}

在我注释掉的两行中,为什么需要一个在用一个char *p来保存最开始传入的det的地址呢?
另外我按照代码上的方法调试(非注释掉的方法),发现还是能够赋值,但是函数结束后其赋值就失败了。。是因为我直接用malloc返回的内存的地址dst来赋值就不行吗?为什么呀?
为什么将dst在传给char *p过后就可以赋值实现strcpy,但是直接操作dst在函数结束后赋值就失败了?
难道直接用malloc返回的内存的地址dst不能进行操作?
照理说char *p作为局部变量在函数结束后就会被释放,但是申请到的stelen(Src)+1字节的内存不会被释放掉呀,但是为什么直接操作dst来赋值得到的效果就像是dst指针被释放掉了一样?

返回给函数调用者的应是分配的**起始**位置,对指钱进行++操作后,指针不断后移,已经发生了改变。

因为在你在复制完全部字符之后,pDst已经指向了字符串的最后位置了,返回的也是这个位置;所以,正确做法是,应该记录字符串头部的位置,复制完毕之后,再把这个头部位置返回