1. 程式人生 > 其它 >【C語言】memcpy和memmove模擬實現

【C語言】memcpy和memmove模擬實現

技術標籤:c語言

標頭檔案:string.h

memcpy

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

功能:函式memcpy從source的位置開始向後複製num個位元組的資料到destination的記憶體位置。

返回值:返回dest。

  • 這個函式在遇到 ‘\0’ 的時候並不會停下來
  • 如果source和destination有任何的重疊,複製的結果都是未定義的

模擬實現

#include<stdio.h>
#include<assert.h>

void* my_memcpy(void*
dest, const void* src, unsigned int num)//傳入資料可能是各種型別的,所以用void*接收 { //斷言,判斷指標的有效性,防止野指標 assert(dest!=NULL); assert(src!=NULL); //void* //可以接收所有型別的指標 //不可以進行解引用和加減整數的操作,但可以比較大小 void* tmp = dest; while (num--) { //把指標型別轉化為char*在解引用和+1/-1時可以訪問一個位元組 *(char*)dest = *(char*)src; ((char*)dest)++
; ((char*)src)++; } return tmp; } int main() { char arr1[] = "abcdef"; char arr2[] = "123456"; printf("arr1=%s\n", (char*)my_memcpy(arr1, arr2, 3));//把arr2的前三個位元組內容拷貝到arr1裡 return 0; }

在這裡插入圖片描述

memmove

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

功能: 函式memmove從source的位置開始向後複製num個位元組的資料到destination的記憶體位置

返回值: 返回dest

  • 和memcpy的差別就是memmove函式處理的源記憶體塊和目標記憶體塊是可以重疊的。
  • 如果源空間和目標空間出現重疊,就得使用memmove函式處理。
#include<stdio.h>
#include<assert.h>

void* my_memmove(void* dest, const void* src, unsigned int num)
{
	//斷言,判斷指標的有效性,防止野指標
	assert(dest != NULL);
	assert(src != NULL);
	//對於重疊拷貝
	//若dest<src,src從前向後拷貝
	//若dest>=src&&dest<=src+num,src從後向前拷貝
	//若dest>src,src從前和從後都可以拷貝
	void* tmp = dest;
	while (num--)
	{
		if (dest < src)//從前向後拷貝
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++(char*)src;
		}
		else//從後向前拷貝
		{
			*((char*)dest + num) = *((char*)src + num);
			--(char*)dest;
			--(char*)src;
		}
	}
	return tmp;
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = sizeof arr/sizeof arr[0];
	int* ret=(int*)(my_memmove(arr, arr + 2, 20));//把34567拷貝到12345上
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", *ret);
		ret++;
	}
	return 0;
}

在這裡插入圖片描述