memcpy, memmove, memset 함수 구현
- 프로그래밍/C/C++
- 2018. 7. 18.
memcpy, memmove, memset 함수 구현
이번에는 memcpy, memmove 함수를 구현 해보겠다.
memcpy, memmove 함수를 잘 모르면 이쪽에 들어가서 보기를 바란다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <string.h> struct tagM1 { int x, y; char buffer[30]; }x1, x2; void* memcpy(void *dest, const void *src, unsigned int count); main() { x1.x = 5; x1.y = 10; strcpy_s(x1.buffer, sizeof(x1.buffer), "memory copy"); memcpy(&x2, &x1, sizeof(x1)); puts(x2.buffer); printf("%d %d\n", x2.x, x2.y); } void* memcpy(void *dest, const void *src, unsigned int count) { for (size_t i = 0; i < count; i++) *((char*)dest + i) = *((char*)src + i); return dest; } | cs |
< 출력 >
15행에서 x2 주소와 x1 주소, x1의 크기를 보내준다.
21행에서 size_t는 unsigned int의 typedf로 변경된 것이다. 조건값은 x1의 크기만큼 돌려준다.
22행에서 dest는 void* 형이니 char*형으로 변환을 해준다.src도 마찬가지.
그리고 i 바이트 만큼 이동을 해준다. (char 형이니 1 바이트씩 이동하게 된다.)
memmove 함수를 구현 해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> char s[20] = "1234567890"; void* memmove(void *dest, const void *src, unsigned int count); main() { puts(s); memmove(s + 4, s + 2, 6); puts(s); } void* memmove(void *dest, const void *src, unsigned int count) { void *ret = dest; if (dest <= src || (char*)dest >= ((char*)src + count)) return ret; else { dest = (char*)dest + count - 1; src = (char*)src + count - 1; for (size_t i = 0; i < count; i++) *((char*)dest - i) = *((char*)src - i); } return ret; } | cs |
< 출력 >
13행에서 영역이 겹치는지 검사를 하게 된다. 만약 겹치지 않는다면 메모리 복사를 하거나 안하거나 값은 똑같기 때문에 ret를 반환해준다.
14행에서 영역이 겹치지 않는다면 메모리 복사를 해준다.
15~16행에서 복사하기 위해서 dest 및 src가 가리키는 번지를 맨 뒤로 이동한다.
18행에서 dest가 가리키는 번지에 src가 가리키는 번지의 값을 대입하고 -1 만큼 감소시킨다.
memset 함수를 구현해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> void* memset(void *dest, int fillChar, unsigned int count); main() { char str[30] = "aossuper8.tistory.com"; puts(str); memset(str, '*', sizeof(str) - 1); puts(str); } void* memset(void *dest, int fillChar, unsigned int count) { for (size_t i = 0; i < count; i++) *((char*)dest + i) = fillChar; return dest; } | cs |
< 출력 >
13행에서 dest + i 된만큼 문자로 메모리를 채운다.
이로써 메모리 관련 함수 구현을 다 해보았다.