 數據拷(kao)貝的方法解析
							時間(jian):2018-09-27      來源:未知
							數據拷(kao)貝的方法解析
							時間(jian):2018-09-27      來源:未知 
							memcpy 與(yu) memmove
區別(bie):兩(liang)個函數都(dou)是(shi)(shi)進行n字(zi)節內(nei)存內(nei)容的拷貝,入口(kou)參數和返回(hui)參數也都(dou)一(yi)樣,可(ke)是(shi)(shi)這(zhe)兩(liang)個函數在內(nei)部實現上(shang)是(shi)(shi)有(you)一(yi)定(ding)區別(bie)的,這(zhe)主要是(shi)(shi)因為dest內(nei)存區域和src內(nei)存區域可(ke)能有(you)一(yi)下四種不同的情況,
注意count的影響:
  
從圖中可(ke)以(yi)看(kan)出,src的(de)內(nei)存區域和(he)dest的(de)內(nei)存區域相對位置(zhi)和(he)重(zhong)疊關系(xi)有四種情(qing)(qing)況,memcpy沒有考慮(lv)重(zhong)疊的(de)情(qing)(qing)況,而memmove考慮(lv)到了全部(bu)情(qing)(qing)況,因此memcpy函數的(de)時(shi)候(hou)可(ke)能(neng)出現意向不到的(de)結果(guo)。
這兩個函數的實現(xian):
***********下面兩個是錯誤的實(shi)現**************
void* memcpy(void* dest, void* source, size_t count) {
void* ret = dest;
//copy from lower address to higher address
while (count--)
*dest++ = *source++; //不(bu)知道兩(liang)個指(zhi)針的類型,不(bu)可以這樣(yang)自(zi)加。
return ret;
}
=======================================================================
void* memmove(void* dest, void* source, size_t count) {
void* ret = dest;
if (dest <= source || dest >= (source + count)) {
//Non-Overlapping Buffers
//copy from lower addresses to higher addresses
while (count --)
*dest++ = *source++;
} else{
//Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--; // 情況同上
}
return ret;
}
***********************正確的如(ru)下(xia)**************************
void* mymemcpy(void* dest, void* source, size_t count) {
char *ret = (char *)dest; char *dest_t = ret;
char *source_t = (char *)source;
while (count--){
*dest_t++ = *source_t++; }
return ret;
}
void *my_memmove(void *dst,const void *src,int count) {
char *ret;
char *dst_t;
char *src_t;
ret = (char *)dst;
if ((unsigned char*)
dst <= (unsigned char*)src || (unsigned char *)dst >= ((unsigned char *)src + count))
{
dst_t = (char *)dst;
src_t = (char *)src;
while (count--)
{
*dst_t++ = *src_t++;
}
}else{
dst_t = (char *)dst + count - 1;
src_t = (char *)src + count - 1;
while (count--)
{
*dst_t-- = *src_t--;
}
}
return(ret); }