memcpy的內存重疊問題

【注】改編自memmove 和 memcpy的區別。原做者若有不爽,請告知!html

memcpy是C語言中的庫函數,在頭文件string.h中,做用是拷貝必定長度的內存的內容,原型分別以下:linux

void *memcpy(void *dest, const void *src, size_t count)

使用memcpy時,有可能會遇到內存重疊的問題:

第一種狀況下,拷貝重疊的區域不會出現問題,內容都可以正確的被拷貝。
第二種狀況下,問題出如今右邊的兩個字節,這兩個字節的原來的內容首先就被覆蓋了,並且沒有保存。因此接下來拷貝的時候,拷貝的是已經被覆蓋的內容,顯然這是有問題的git

經過memmove能夠避免這一問題。memmove和memcpy實現同樣的功能:內存拷貝。原型以下:github

void *memmove(void *dest, const void *src, size_t count)

如下幾點你須要瞭解:app

  1. memove能夠避免內存拷貝時的重疊問題。
  2. 實際上,memcpy只是memmove的一個子集。
  3. memcpy比memmove的速度要快一些。

有興趣的,能夠看看linux的源碼,實現很簡單,一看就明白。函數

/**
 * memcpy - Copy one area of memory to another
 * @dest: Where to copy to
 * @src: Where to copy from
 * @count: The size of the area.
 *
 * You should not use this function to access IO space, use memcpy_toio()
 * or memcpy_fromio() instead.
 */
void *memcpy(void *dest, const void *src, size_t count)
{
	char *tmp = dest;
	const char *s = src;

	while (count--)
		*tmp++ = *s++;
	return dest;
}

/**
 * memmove - Copy one area of memory to another
 * @dest: Where to copy to
 * @src: Where to copy from
 * @count: The size of the area.
 *
 * Unlike memcpy(), memmove() copes with overlapping areas.
 */
void *memmove(void *dest, const void *src, size_t count)
{
	char *tmp;
	const char *s;

	if (dest <= src) {
		tmp = dest;
		s = src;
		while (count--)
			*tmp++ = *s++;
	} else {
		tmp = dest;
		tmp += count;
		s = src;
		s += count;
		while (count--)
			*--tmp = *--s;
	}
	return dest;
}
相關文章
相關標籤/搜索