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; }
就是遇到被拷貝的空間起始處在拷貝空間中,將會遇到拷貝內存覆蓋的現象。在這種情況下我們將考慮從尾部進行拷貝。所以進行了判斷。