溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言--memcpy和memmove

發(fā)布時(shí)間:2020-08-12 07:11:27 來(lái)源:網(wǎng)絡(luò) 閱讀:384 作者:伯爵213 欄目:編程語(yǔ)言

一、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;
}


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI