본문으로 바로가기
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로 복사를 진행하기 때문에 이미 복사된 영역에 대해서 이상한 값이 저장되는 것을 볼 수 있습니다.

겹친영역을 memmove로 복사했을 경우
겹친영역을 memcpy로 복사했을 경우

 

다른 string.h 파일의 함수에 대해 알고 싶으시다면 String.h 함수 파헤치기!!

 

C언어 라이브러리 - String.h 헤더 파일 분석하기(String.h 함수 모음)

c언어를 사용하시거나 해보셨던 분들은 대부분 memcpy, memset 함수를 사용해보셨을 텐데요. 해당 함수를 사용하기 위해서는 String.h 파일을 포함시켜줬던 기억이 나실겁니다. 요렇게요 #include #include

idsn.tistory.com

 

반응형