對(duì)于字符串來說,我們運(yùn)用字符串C語言 字符串的內(nèi)存拷貝處理函數(shù)
。他們操作的對(duì)象是內(nèi)存,然后可以接受任何類型的數(shù)據(jù)進(jìn)行拷貝。
這個(gè)是
void *memcpy(void *dest,const void *src,size_t count);
與strcpy不同的就是添加了第三個(gè)參數(shù),確定操作的字節(jié)數(shù),然后參數(shù)類型還有返回類型都是void*
,這表示他可以拷貝任意類型的數(shù)據(jù)。
然后我們看一下實(shí)現(xiàn):
memcpy:
void *my_memcpy(void *str,const void *Dstr,int count) //從內(nèi)存地址開始改變,并確定改變長(zhǎng)度,所以用萬能類型去接受{ 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;}
然后會(huì)出現(xiàn)一個(gè)問題,如果我們拷貝的數(shù)據(jù)中Dstr的起始位置在STR操作之間,那么在改變str時(shí)會(huì)出現(xiàn)副作用,將導(dǎo)致我們的拷貝結(jié)果不正確,所以我們應(yīng)該考慮到會(huì)覆蓋的情況,
電腦資料
《C語言 字符串的內(nèi)存拷貝處理函數(shù)》(http://www.ishadingyu.com)。在函數(shù)庫中有一個(gè)memmove函數(shù)。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;}
就是遇到被拷貝的空間起始處在拷貝空間中,將會(huì)遇到拷貝內(nèi)存覆蓋的現(xiàn)象。在這種情況下我們將考慮從尾部進(jìn)行拷貝。所以進(jìn)行了判斷。