當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]/*??memcpy是不管有否區(qū)域重疊的,重疊不重疊照樣復(fù)制,? memmove才會(huì)避免區(qū)域重疊,檢測(cè)這個(gè)區(qū)域重疊很簡(jiǎn)單,如果目標(biāo)地址在源區(qū)域內(nèi),那就會(huì)發(fā)生重疊.??處理重疊也很簡(jiǎn)單,從源地址的末尾開

/*
??memcpy是不管有否區(qū)域重疊的,重疊不重疊照樣復(fù)制,
? memmove才會(huì)避免區(qū)域重疊,檢測(cè)這個(gè)區(qū)域重疊很簡(jiǎn)單,如果目標(biāo)地址在源區(qū)域內(nèi),那就會(huì)發(fā)生重疊.
??處理重疊也很簡(jiǎn)單,從源地址的末尾開始反方向復(fù)制就OK了。

未重疊的情況:

?內(nèi)存布局(little endian):
?higher address ? ? ? ? ? ? ? ? ? ? ? ? ? lower address?

?? |--------------------------------------|

??????????????????????????????? src

????????????????? |------------|

??? |-----------|??????????????? |------------|

??????????????? dest??????????????????????????? dest



目標(biāo)區(qū)域的首地址在源區(qū)域內(nèi),就發(fā)生重疊了。

??????????????? ? ? ?? higher address???? ? ? ? ?? src(lower address)
???????????????????????? ? ? |---------------------|
??????????|---------------------|
???????????????????????????? ? ?? dest
??????????????
*/

//下面是memmove源碼的一段:


#include

//pDest < pSrc 順序拷貝,否則逆序
#if 1
void *my_memcpy(void *dest, const void *src, size_t n)
{
????char *pdest = (char*)dest;
????const char *psrc = (char *)src;
????size_t i;

????if(NULL == dest && NULL == src && (n == 0))
????{
????????return;
????}

????if((pdest > psrc) && (pdest < psrc + n))
????{
????????/* 反向拷貝 */
????????for(i = n - 1; i <= 0; ++i)
????????{
???????????pdest[i] = psrc[i];
????????}
????}
????else
????{
????????/* 正向拷貝 */
????????for(i = 0; i < n; ++i)
????????{
????????????pdest[i] = psrc[i];
????????}
????}
????pdest = '