오늘 알아볼 memcpy 함수는 "메모리를 복사" 하는 함수다.
memcpy?
메모리(Memory)를 복사(카피, copy) 하는 함수다. memcpy함수를 사용하기 위해서는 string.h파일이나 memory.h 파일이 include 되어 있어야 한다. 일반적으로 string.h파일을 include 한다. 아래 코드를 보자.
#include <stdio.h>
#include <string.h>
int main(void)
{
int a = 10;
int b = 0;
printf("a = %d\n", a);
printf("b = %d\n", b);
memcpy(&b, &a, sizeof(int));
printf("a = %d\n", a);
printf("b = %d\n", b);
return 1;
}
int형 변수 a를 10으로 초기화하고, int형 변수 b를 0으로 초기화시켰다. 첫 번째, 두 번째 printf 결과를 확인해보면 10과 0이 출력되는 것을 확인할 수 있다. 바로 아래 memcpy를 보자. 첫 번째 전달 인자에 b의 주소 값을 전달하고, 두 번째 전달 인자에 a의 주소 값을 전달했다. 마지막 전달 인자로 int형의 사이즈 값을 전달했다. msdn에 memcpy를 검색해보면 아래와 같이 나온다.
wmemcpy는 뒤로하고 memcpy를 살펴보자. memset과 마찬가지로 세 개의 매개변수가 있다.
첫 번째 매개변수 void *dest는 데이터를 복사할 새로운 공간의 주소를 가리킨다.
두 번째 매개변수 const void *src는 첫 번째 매개변수에 복사할 값이 있는 주소를 가리킨다.
세 번째 매개변수 size_t count는 복사할 데이터의 크기(길이)다.
memcpy를 실행한 다음 printf문을 보면 a와 b의 값이 같아진 걸 확인할 수 있다. 변수 a의 값을 변수 b에 복사했기 때문이다.
memcpy로 구조체 복사하기
memcpy는 메모리 영역의 값을 다른 메모리 영역으로 복사하는 기능을 하기 때문에 배열, 구조체에서도 활용할 수 있다. 아래 코드를 보자.
struct People {
char name[20];
int age;
float height;
float weight;
};
int main(void)
{
struct People p = { "cong Park blog", 22, 183.8, 77.8 };
printf("%s\n", p.name);
printf("%d\n", p.age);
printf("%.2f\n", p.height);
printf("%.2f\n", p.weight);
memcpy(&p.name, "CONG", sizeof(char) * 4);
printf("%s\n", p.name);
printf("%d\n", p.age);
printf("%.2f\n", p.height);
printf("%.2f\n", p.weight);
return 1;
}
사람의 정보를 표현하는 People 구조체를 만들고 Peopel형 변수 p를 만들고 초기화시켰다. memcpy 이전의 printf 문 출력을 확인해보면 아래와 같을 것이다.
cong Park blog
22
183.80
77.80
memcpy 이후의 printf문 출력을 확인해보면,
CONG park blog
22
183.80
77.80
p.name[0] 부터 p.name[3]까지의 값인 "cong"가 대문자 "CONG"로 변경된 것을 확인할 수 있다.
정리하면,
특정 메모리 영역에 원하는 값을 원하는 크기(길이)만큼 복사할 수 있다.
- 끝 -
'Programming language > C' 카테고리의 다른 글
[C] 포인터, C 포인터, C Pointer, 포인터 활용하기 - 1 (0) | 2022.09.03 |
---|---|
[C] sscanf, C언어 sscanf, sscanf 함수, sscanf 사용법 (0) | 2022.08.31 |
[C] memset, C언어 memset, memset 함수 (0) | 2022.08.30 |
assert, static_assert (0) | 2021.05.26 |
gcc __attribute__((used)), ((aligned(x))), ((packed)), ((weak)) (0) | 2021.05.26 |