본문 바로가기
Programming/C C++

C/C++ 메모리 복사 memcpy 함수

by whitele 2021. 7. 16.
반응형

 

memcpy란

 특정 메모리를 다뤄 복사하는 함수이다. 헤더 파일을 보면 문자열 관련 함수로 보일 수 있으나 그것보다 더 범용성이 넓다. memory copy의 약자이며 지정한 메모리의 내용을 다른 곳으로 복사하기 위해 사용한다. 깊은 복사를 사용하여 복사를 진행한다.

 

 

 기본 함수 및 인자

void* memcpy(void* dst, void* src, size_t num)

 string.h 헤더 파일을 포함해야 하며 memory.h에도 정의되어있다. c++에서는 <cstring> 헤더 파일을 포함하면 된다.

  • dst : 복사받는 메모리를 가리키는 포인터
  • src : 복사하려는 원은 메로리를 가리키는 포인터
  • num : 복사할 바이트 수

성공 시 dst 포인터를 반환하며 실패 시 NULL을 반환한다.

 

 

memcpy 함수 사용

 memcpy 함수는 특정한 메모리를 복사하기 위해 사용된다. memmove와 동작은 유사하나 버퍼를 사용하지 않는 점 때문에 memcpy는 메모리가 상호 배제되어야 한다. 전혀 다른 메모리 공간에 똑같은 데이터 복사를 수행한다. 메모리를 직접 다루기 때문에 사용자 정의 자료형을 포함한 자료형에 대한 이해뿐만 아니라 그 안에 어떠한 메모리가 배치되어 있는지 어느 정도 파악해야 한다. 자칫 버그나 오류로 이어질 수 있어 주의해야 한다.

memcpy 함수 예제

#include <string.h>
#include <stdio.h>

int main(){
	
	char ab[20]="hello";
	char aa[20];
	
	printf("%s\n",ab);
	printf("%s\n",aa);
	
	memcpy(aa,ab,5*sizeof(char));
	
	printf("%s\n",aa);
}

 

ab를 aa에 복사하는 예제이다. char크기만큼 5번의 크기 즉 5byte를 복사하는 예제이다.

 

ex1 실행예

#include <string.h>
#include <stdio.h>

int main(){
	
	char ab[20]="hello";
	char aa[20];
	
	printf("%s\n",ab);
	printf("%s\n",aa);
	
	memcpy(aa,ab,5*sizeof(char));
	
	printf("%s\n",aa);
	
	memcpy(aa,ab,6*sizeof(char));
	
	printf("%s\n",aa);
	
	return 0;
}

ex2 실행 예

 

몇 줄의 코드를 수정한 예제의 결과이다. 단지 1byte를 크게 했을 뿐인데 hello까지만 출력되었다. ab변수의 \0까지 복사가 되어 다음처럼 hello만 복사가 된 것이다. 앞서 말했던 것처럼 메모리를 유의하면서 코드를 짜야하는 이유가 다음과 같다. 5, 6의 차이는 전혀 다른 결과를 보여준다.

728x90
반응형

댓글