您好,登錄后才能下訂單哦!
一、memcpy
memcpy函數(shù)的功能是從源src所指的內(nèi)存地址的起始位置開(kāi)始拷貝n個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。
void* my_memcpy(void* dest, const void *src, size_t n) { assert(dest); assert(src); char* dest_t = (char*)dest; char* src_t =(char*) src; while (n--) { *dest_t = *src_t; dest_t++; src_t++; } return dest; }
二、memmove
memmove用于從src拷貝n個(gè)字符到dest,如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中。但復(fù)制后src內(nèi)容會(huì)被更改。但是當(dāng)目標(biāo)區(qū)域與源區(qū)域沒(méi)有重疊則和memcpy函數(shù)功能相同。
void* my_memmove(void* dest, const void*src, size_t n) { assert(dest); assert(src); void *ret = dest; char* dest_t = (char*)dest; char* src_t = (char*)src; if (dest_t <= src_t || dest_t >= (src_t + n)) { // 若dst和src區(qū)域沒(méi)有重疊,則從起始處開(kāi)始逐一拷貝; while (n--) { *dest_t++ = *src_t++; } } else { // 若dst和src 區(qū)域交叉,則從尾部開(kāi)始向起始位置拷貝,可以避免數(shù)據(jù)沖突 dest_t += n - 1; src_t += n - 1; while (n--) { *dest_t-- = *src_t--; } } return ret; }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。