memcpy와 memset
원시 메모리 함수를 알아봅니다
memcpy와 memset은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
원시 메모리 함수
문자열 함수와 달리 memcpy와 memset은 원시 바이트를 대상으로 하며 널 종결자를 무시합니다.
이 함수들은 <string.h>에 선언되어 있고, 지정한 바이트 개수를 대상으로 작동하므로 모든 자료형에 사용할 수 있습니다.
#include <stdio.h>
#include <string.h>
int main(void) {
int src[] = {1, 2, 3};
int dest[3];
memcpy(dest, src, sizeof(src));
printf("%d %d %d\n", dest[0], dest[1], dest[2]);
return 0;
}memcpy의 선언
void *memcpy(void *dest, const void *src, size_t n);
src에서 정확히 n바이트를 dest로 복사하고 dest를 반환합니다. 올바른 바이트 수를 구하려면 sizeof를 사용하세요.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "copy me";
char dest[16];
memcpy(dest, src, strlen(src) + 1);
printf("%s\n", dest);
return 0;
}바이트를 올바르게 세기
개수의 단위는 요소가 아니라 바이트입니다. int 배열에서는 sizeof(int)를 곱해야 합니다.
실제 배열에 sizeof(array)를 사용하면 전체 바이트 크기를 자동으로 얻습니다.
#include <stdio.h>
#include <string.h>
int main(void) {
double a[4] = {1.5, 2.5, 3.5, 4.5};
double b[4];
memcpy(b, a, 4 * sizeof(double));
printf("%.1f %.1f\n", b[0], b[3]);
return 0;
}영역이 겹치면 안 됩니다
소스 영역과 대상 영역이 겹치면 memcpy는 정의되지 않은 동작을 일으킵니다.
범위가 겹칠 수 있을 때(예를 들어 하나의 배열 안에서 요소를 이동할 때)는 겹침을 안전하게 처리하는 memmove를 사용하세요.
#include <stdio.h>
#include <string.h>
int main(void) {
char buf[] = "ABCDEF";
memmove(buf + 2, buf, 4);
printf("%s\n", buf);
return 0;
}memset의 선언
void *memset(void *ptr, int value, size_t n);
ptr에서 시작하는 n바이트를 바이트 값 value로 채웁니다. 값은 unsigned char로 해석되므로 가장 낮은 8비트만 의미가 있습니다.
#include <stdio.h>
#include <string.h>
int main(void) {
char buf[6];
memset(buf, 'x', 5);
buf[5] = '\0';
printf("%s\n", buf);
return 0;
}메모리를 0으로 초기화하기
memset은 사용하기 전에 버퍼나 구조체 전체를 0으로 지울 때 가장 흔히 사용합니다.
memset(arr, 0, sizeof(arr))은 모든 바이트를 0으로 설정하며, 이는 정수, 부동 소수점 수, 포인터에서 유효한 0입니다.
#include <stdio.h>
#include <string.h>
int main(void) {
int counts[5];
memset(counts, 0, sizeof(counts));
for (int i = 0; i < 5; i++) printf("%d ", counts[i]);
printf("\n");
return 0;
}memset은 바이트 단위로 작동합니다
주의하세요. memset은 각 요소가 아니라 각 바이트를 설정합니다. 정수 배열을 값 1로 채우기 위해 사용해도 1이 되지 않습니다.
각 정수의 모든 바이트가 0x01로 설정되어 1이 아니라 0x01010101이 됩니다.
#include <stdio.h>
#include <string.h>
int main(void) {
int a[2];
memset(a, 1, sizeof(a));
printf("%d\n", a[0]);
return 0;
}구조체 지우기
memset을 사용하면 각 필드를 직접 설정하는 대신 한 번의 호출로 전체 구조체를 0으로 초기화할 수 있어 편리합니다.
#include <stdio.h>
#include <string.h>
struct Point { int x; int y; int z; };
int main(void) {
struct Point p;
memset(&p, 0, sizeof(p));
printf("%d %d %d\n", p.x, p.y, p.z);
return 0;
}구조체 복사하기
memcpy로 구조체를 복사할 수 있지만, 일반 대입(b = a;)이 보통 같은 작업을 더 명확하게 수행합니다.
자료형이 제거된 일반 void * 포인터를 통해 복사할 때는 memcpy를 사용하는 것이 좋습니다.
#include <stdio.h>
#include <string.h>
struct Rec { int id; char tag; };
int main(void) {
struct Rec a = {42, 'A'};
struct Rec b;
memcpy(&b, &a, sizeof(a));
printf("%d %c\n", b.id, b.tag);
return 0;
}memcmp: 메모리 비교
관련 함수인 memcmp(a, b, n)은 n개의 원시 바이트를 비교하고, 일치하면 0을 반환합니다.
strcmp와 달리 널 종결자에서 멈추지 않으므로 모든 이진 데이터에 사용할 수 있습니다.
#include <stdio.h>
#include <string.h>
int main(void) {
int a[] = {1, 2, 3};
int b[] = {1, 2, 3};
if (memcmp(a, b, sizeof(a)) == 0)
printf("Arrays have identical bytes\n");
return 0;
}이 함수들이 빠른 이유
memcpy와 memset은 한 명령으로 많은 바이트를 이동하도록 어셈블리에서 수동 최적화되는 경우가 많습니다.
일반적으로 직접 작성한 바이트 반복문보다 훨씬 빠르므로, 대량 데이터 이동과 초기화에는 이 함수들을 우선 사용하세요.
#include <stdio.h>
#include <string.h>
int main(void) {
char big[1000];
memset(big, 0, sizeof(big));
printf("Cleared %lu bytes\n", sizeof(big));
return 0;
}빠른 확인
memset의 바이트 수준 작동 방식에 대한 이해도를 확인해 보세요.
복습
원시 메모리 함수를 배웠습니다.
- memcpy는 n바이트를 복사하며, 영역이 겹치면 안 됩니다(겹칠 수 있다면 memmove를 사용하세요).
- memset은 n바이트를 하나의 바이트 값으로 채우며, 0으로 초기화할 때 유용합니다.
- 개수의 단위는 바이트입니다.
sizeof를 사용하고 바이트와 요소를 혼동하지 않도록 주의하세요. - memcmp는
'\0'에서 멈추지 않고 원시 바이트를 비교합니다.
자주 묻는 질문
“memcpy와 memset” 강의는 무료인가요?
네 — “memcpy와 memset” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“memcpy와 memset”에서 뭘 배우나요?
원시 메모리 함수를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“memcpy와 memset” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- strlen, strcpy, strcat
- strcmp와 비교
- strtok과 토큰화
- memcpy와 memset