memcpy, memmove, memset 함수 구현

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 + 26);
    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

< 출력 >


7행에서 sizeof(str)-1 해준 이유는 '\0' 전까지만 메모리를 채우라는 뜻이다.
13행에서 dest + i 된만큼 문자로 메모리를 채운다.

이로써 메모리 관련 함수 구현을 다 해보았다.

댓글

Designed by JB FACTORY