// temp memory를 사용하는 경우
void* MyMemmove1(char* dest, char* src, size_t n) {
char* tmp = static_cast<char*>(malloc(sizeof(char) * n));
// tmp에 원본을 미리 저장
for (size_t i = 0; i < n; ++i)
{
*(tmp + i) = *(src + i);
}
// 타겟에 tmp에 저장한 값을 옮김
for (size_t i = 0; i < n; ++i)
{
*(dest + i) = *(tmp + i);
}
return dest;
}
// temp memory를 사용하지 않는 경우
void* MyMemmove2(char* dest, char* src, size_t n) {
signed char operation;
size_t end;
size_t current;
if (dest != src) {
// **시작하는 방향을 설정**
// 1. source가 target보다 뒤인 경우
// 이미 복사한 값과 복사되어야 하는 값의 영역이 겹치지 않아
// overlapping 위험이 없다
if (dest < src) {
operation = 1;
current = 0;
end = n;
}
// 2. source가 target보다 앞인 경우
// 뒤에서부터 미리 복사해놓고 앞으로 이동한다
// 겹치는 부분에 대해 overlapping을 방지
else {
operation = -1;
current = n - 1;
end = -1;
}
// 결론은, source의 뒷부분부터 미리 target에 복사하면 된다는 것
for (; current != end; current += operation) {
*(dest + current) = *(src + current);
}
}
return dest;
}