void *my_memcpy(void *str,const void *Dstr,int count)
//從內存地址開始改變,並確定改變長度,所以用萬能類型去接受
{
char *pstr = (char *)str;
char *pDstr = (char *)Dstr;
assert((str!=NULL) && (Dstr != NULL));
if(str == Dstr)
//位置相同情況下直接返回需要改變的
return (char *)Dstr;
while(count-- > 0)
{
*pstr++ = *pDstr++;
}
return str;
}
然後會出現一個問題,如果我們拷貝的數據中Dstr的起始位置在STR操作之間,那麼在改變str時會出現副作用,將導致我們的拷貝結果不正確,所以我們應該考慮到會覆蓋的情況。在函數庫中有一個memmove函數。 memmove:
void *my_memmove(void *pst,const void *Dpst,int size)
{
void *p = pst;
char *pstA = (char *)pst;
char *pstB = (char *)Dpst;
assert((pst != NULL) &&(Dpst != NULL));
if(pstB<pstA< pstB+size)
{
while(size--)
{
*(pstA+size) = *(pstB+size);
}
}
else
{
while(size--)
{
*pstA++ = *pstB++;
}
}
return p;
}
就是遇到被拷貝的空間起始處在拷貝空間中,將會遇到拷貝內存覆蓋的現象。在這種情況下我們將考慮從尾部進行拷貝。所以進行了判斷。