用C語言實現函數void * memmove(void *dest,const void *src,size_t n)

在C/C++標準庫函數中存在該函數,它用於將src指向的n個字節的數據拷貝到dest位置。在標準庫函數中還存在另外一個函數memcpy,它也用來實現內存拷貝,但它不考慮區間重疊問題,在拷貝過程中可能造成重疊錯誤。

而memmove則針對上訴問題給出了一定的處理措施來防止拷貝出錯:

(1)當源內存的首地址等於目標內存的首地址時,不進行任何拷貝

(2)當源內存的首地址大於目標內存的首地址時,實行正向拷貝

(3)當源內存的首地址小於目標內存的首地址時,實行反向拷貝

下面給出memmove的具體實現,關於memcpy可參考庫函數實現或相關資料。

void *memmove(void *dest,const void *src, size_t n)
{
	if (NULL == dest || src == NULL)
	{
		cerr<<"NULL pointers!";
		return NULL;
	}
	int step;
	char *p, *q;
	if ((char *)src == (char *)dest) {
		return dest;
	} else if ((char *)src > (char *)dest) {	
		step = 1;
		p = (char *)src;
		q = (char *)dest;
	} else {
		step = -1;
		p = (char *)src + n - 1;
		q = (char *)dest + n - 1;
	}
	for(int i = 0; i != n; ++i) {
		*q = *p;
		p += step;
		q += step;
	}
	return dest;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章