0Pricing
C Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. strlen, strcpy, strcat
  2. strcmp와 비교
  3. strtok과 토큰화
  4. memcpy와 memset
← C Academy(으)로 돌아가기