C 언어 - memcpy, memmove 시뮬레이션

1. memcpy 기능 도입 및 구현

memcpy 함수는 원본 위치에서 대상 메모리 위치로 num 바이트의 데이터를 거꾸로 복사합니다. 함수는 '\0'을 만나도 멈추지 않습니다. 소스와 대상이 겹치는 경우 복사 결과가 정의되지 않습니다.

void * memcpy ( void * destination, const void * source, size_t num );

사실 memcpy를 구현하는 방법은 매우 간단하다 어떤 데이터 타입을 건네주든 일률적으로 char*로 변환해준다 char 데이터 타입이 1바이트를 차지한다는 것을 알고 있다. 바이트 단위로 복사하는 데이터 유형이 무엇이든 상관 없습니다. 코드는 다음과 같이 구현됩니다.

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;

	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;//逐个字节++
		src = (char*)src + 1;//逐个字节++
	}
	return ret;
}

2. memmove 기능 도입 및 구현

memcpy와의 차이점은 memmove 함수에 의해 처리되는 소스 메모리 블록과 대상 메모리 블록이 겹칠 수 있다는 것입니다. 원본 공간과 대상 공간이 겹치는 경우 memmove 함수를 사용하여 처리해야 합니다.

void * memmove ( void* destination, const void * source, size_t num );

여기에서는 두 가지 경우에 대상 > 소스 및 대상 < 소스에 대해 설명합니다. 먼저 코드 구현을 살펴보겠습니다.

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;

	if (dest < src)
	{
		//前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (num--)//20
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

dest<src가 memcpy 구현 코드와 동일한 경우 여기에서 앞에서 뒤로 복사해도 겹치는 부분의 값이 변경되지 않기 때문입니다.

위는 memcpy 및 memmove의 전체 구현 프로세스 및 아이디어입니다. 시청해 주셔서 감사합니다.

추천

출처blog.csdn.net/m0_74358683/article/details/131678525