memcpy,memmove的實現

audience_fzn發表於2018-08-04

1.memcpy()的實現

函式原型:

char *memcpy(void * destination,const void * source,size_t num)
  • 記憶體拷貝函式,從source的位置開始向後拷貝num個位元組的資料到dest的記憶體位置。
  • memcpy按位元組拷貝,並不是只能拷貝字串,所以沒有‘\0’結束標誌(遇到‘/0’不會停止),按指定是位元組數大小拷貝
  • str家族函式只能處理字串型別的資料,而mem可以處理任意型別的資料
  • 如果source和destination有任何重疊,複製的結果都是未定義的
void* my_memcpy(void * dest, void * src, size_t count)
{
	assert(dest);
	assert(src);
	char* p = (char *)dest;
	char* q = (char *)src;
	while (count--)
	{
		*p = *q;
		p++;
		q++;
	}
	return dest;
}

//void變數 不能被定義,因為編譯器不知道它的大小,但是void*變數可以被定義出來,因為它是個指標,可以接受任意型別的指標

memcpy函式在拷貝的時候可能出現記憶體重疊問題,導致結果與預期的不一樣。此時就可以使用memmove()解決

memcpy從前向後拷貝,本來我們想要的結果是“hello worl”,但是它的第一個h拷過去以後,之後拷貝的都是h,如果用memmove拷貝他會從後向前拷貝從而解決記憶體重疊問題

2.memmove()的實現 

函式原型:

voi * memmove(void * destination,const void * source,size_t num)
  • 它也是記憶體拷貝函式,與memcpy的差別在於他可以解決記憶體重疊問題
  • 如果原空間和目標空間出現重疊,就使用memmove函式處理
void* memmove(void *dest, void *src, size_t count)
{
	void * ret = dest;
	if (dest <= src || (char*)dest >= ((char*)src + count))
	{
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		dest = (char*)dest + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

 

 

 

相關文章