https://blog.csdn.net/lz20120808/article/details/52135046
考察细节
1,检查指针有效性;
2,返回目的指针des;
3.地址重叠
void *Memcpy(void *dst, const void *src, size_t size)
{
if (dst == NULL || src == NULL)
return NULL;
char *psrc;
char *pdst;
//地址重叠的情况
if ((src < dst) && (char*)src + size > (char *)dst)
{
psrc = (char*)src + size - 1;
pdst = (char*)dst + size - 1;
while(size--)
{
*pdst-- = *pdst--;
}
}else {
psrc = (char*)src;
pdst = (char*)dst;
while(size--)
{
*pdst++ = *psrc++;
}
}
return dst;
}
或者
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
void * mymemcpy(void *dst, const void *src, size_t count)
{
if (dst== NULL || src == NULL)
return NULL;
char *pdest = (char *)(dst);
const char *psrc = (char *)(psrc);
int n = count;
//pdest地址高于psrc地址,且有重叠
if (pdest > psrc && pdest < psrc+count)
{
for (size_t i=n-1; i != -1; --i) // 从n-1开始到0 拷贝n个字节
{
pdest[i] = psrc[i];//从高到低赋值
}
}
//pdest地址低于psrc地址,且有重叠
else if(pdest < psrc && pdest > psrc-count)
{
for (size_t i= 0; i < n; i++)
{
pdest[i] = psrc[i];//从低到高赋值
}
} else{
while(num--)
{
*pdst++ = *psrc++;
}
}
return dst;
}