Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 황리단길기념품
- cu 편의점
- 서현 맛집
- 냉동만두 추천
- 편의점 추천
- CU편의점 추천
- 수지 술집
- 편스토랑
- 분당 맛집
- 분당맛집
- 서현역중식
- 푸라닭
- 오뚜기 라면
- 용인맛집
- 서현역맛집
- 황리단길맛집
- 대구동성로맛집
- CU편의점
- BBQ 신메뉴
- 교촌치킨 신메뉴
- CU 편의점 추천
- 경주맛집
- 황리단길디저트
- 치킨 신메뉴
- 순천맛집
- 마켓컬리 추천
- 순천디저트
- 편의점 신제품
- 수원 맛집
- 동성로맛집
Archives
- Today
- Total
일상 메모장
memmove 사용법 및 구현 - C 메모리 이동 본문
사용법
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);
정의
memmove() 함수는 src 메모리 영역에서 dest 메모리 영역으로 n byte 만큼 복사합니다.
src 배열은 src와 dest 의 메모리 영역과 겹치지 않는 메모리 영역부터 먼저 복사합니다.
반환 값
dest 의 포인터를 반환합니다.
memcpy() 구현 (memcpy 실제 구현부)
/**
* memmove - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* Unlike memcpy(), memmove() copes with overlapping areas.
*/
void *memmove(void *dest, const void *src, size_t count)
{
char *tmp;
const char *s;
if (dest <= src) {
/*
* src 의 주소가 dest 보다 큰 값이면,
* src 의 처음 부터 count 만큼 dest 에 복사한다.
* src를 한 byte씩 복사하더라도 dest 보다 큰 위치에 있기 때문에,
* 오버랩되더라도 src 를 모두 정상적으로 dest에 복사할수 있다.
*/
tmp = dest;
s = src;
while (count--)
*tmp++ = *s++;
} else {
/*
* src의 주소가 dest 보다 작은 값이면,
* src 의 마지막 데이터부터 한바이트씩 dest의 마지막 바이트부터
* 순서대로 복사한다.
*/
tmp = dest;
tmp += count;
s = src;
s += count;
while (count--)
*--tmp = *--s;
}
return dest;
}
char array[10] 배열이 있고 [2]~[5] 까지 test 라는 문자열을 array[0]으로 옮기는 예를 들으면,
memmove(array, array + 2, 4); 이렇게 되면 dest 는 src보다 작은 값을 가지게 됩니다.
그러므로 위 코드대로 src 첫번째 byte부터 순차적으로 dest 에 한 byte씩 복사하게 됩니다.
위와 반대로 char array[10] 배열이 있고 [0] ~ [3] 까지 test 라는 문자열을 array[2]로 옮기는 예를 들으면,
memmove(array + 2, array, 4); 이렇게 되면 dest 는 src 보다 큰 값을 가지게 됩니다.
그러므로 src 마지막 바이트부터 한 byte씩 순차적으로 dest 에 복사합니다.
예제
#include <string.h>
#include <stdio.h>
int main(void)
{
char array[10];
memset(array, 0, sizeof(array));
strcpy(array, "test");
printf("original : %s\n", array);
memmove(array+2, array, strlen("test"));
printf("after memmove : %s\n", array);
return 0;
}
결과값은
original : test
after memmove : tetest
입니다.
'C 언어' 카테고리의 다른 글
strcpy 사용법 및 구현 - C 문자열 복사 (4) | 2020.02.03 |
---|---|
memcpy 사용법 및 구현 - C 메모리 복사 (2) | 2020.01.29 |
strchr 사용법 및 구현 - C 문자열 처리 (0) | 2020.01.21 |
strcat 사용법 및 구현 - C 문자열 처리 (0) | 2020.01.19 |
strcmp 사용법 및 구현 - C 문자열 처리 (5) | 2020.01.11 |