728x90
반응형
memmove() 함수의 헤더파일
#include <string.h>
memmove() 함수의 원형
void * memmove(void * des, const void * src, size_t num);
Parameter
des
데이터를 복사할 주소이고 void * 형으로 변환되어서 전달된다.
주소를 전달해주면 된다.
src
복사할 데이터가 존재하는 위치의 주소이고 void * 형으로 변환되어서 전달된다.
주소를 전달해주면 된다.
num
복사할 데이터의 byte 수이며 size_t 형으로 전달해주면 된다.
리턴값
des 주소가 void * 형으로 리턴된다.
memmove 함수는 src의 num byte 만큼 des로 복사하는 함수이다. 얼핏 보면 memcpy와 동일한 함수인데 왜 memmove 함수를 만들었을? 하는 의문이 든다.
memcpy 함수는 단순히 src에서 des로 num byte 만큼 바로 복사를 해서 src 와 des의 범위가 겹치면 문제가 발생한다.
하지만 memmove는 src를 중간에 buffer로 복사시켜놓고 buffer에서 des로 다시 복사를 진행하기 때문에 중간에 범위가 겹쳐져도 문제가 없다.
자 한번 확인해보죠.
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "hello world!!";
char buffer[20];
memset(buffer, 0, 20); //buffer를 초기화
memmove(buffer, str, strlen(str)); //buffer에 str 문자열을 복사
printf("*************************\n");
printf("str addr : %x\n", str);
printf("buffer addr : %x\n", buffer);
printf("str: [%s]\n", str);
printf("buffer: [%s]\n", buffer);
memmove(&buffer[6], buffer, sizeof(buffer)) //buffer에 str문자열 world를 hello로 변경
printf("changed buffer: [%s]\n", buffer);
printf("*************************\n");
return 0;
"memmove.c" 24L, 485C 1,1 Top
실행 결과
memmove로 겹쳐진 영역을 복사했을 경우 내부 buffer에 임시 저장되기 때문에 정상적으로 복사가 잘되는 모습을 볼 수 있습니다. 하지만 memcpy를 사용하여 복사를 하면 buffer 없이 src에서 des로 복사를 진행하기 때문에 이미 복사된 영역에 대해서 이상한 값이 저장되는 것을 볼 수 있습니다.
다른 string.h 파일의 함수에 대해 알고 싶으시다면 String.h 함수 파헤치기!!
C언어 라이브러리 - String.h 헤더 파일 분석하기(String.h 함수 모음)
c언어를 사용하시거나 해보셨던 분들은 대부분 memcpy, memset 함수를 사용해보셨을 텐데요. 해당 함수를 사용하기 위해서는 String.h 파일을 포함시켜줬던 기억이 나실겁니다. 요렇게요 #include #include
idsn.tistory.com
반응형
'C 언어 > C 언어 리이브러리 함수' 카테고리의 다른 글
[C언어] String.h 라이브러리 함수 - strncpy() 함수 파헤치기 (0) | 2021.01.25 |
---|---|
[C언어] String.h 라이브러리 함수 - strcpy() 함수 파헤치기 (0) | 2021.01.20 |
[C언어] String.h 라이브러리 함수 - memcpy() 함수 파헤치기 (0) | 2021.01.17 |
[C언어] String.h 라이브러리 함수 - strdup() 함수 파헤치기 (0) | 2021.01.17 |
[C언어] String.h 헤더 파일 분석하기(String.h 함수 모음, C언어 래퍼런스) (1) | 2021.01.16 |