본문 바로가기
IVS/C 프로그래밍

[C] 배열 복사- memcpy, 비교- memcmp

by 코곰_ 2025. 1. 13.

memcpy

 

  • 설명: 메모리 블록 간의 데이터를 복사한다.
  • 용도: 메모리 블록을 다른 메모리 블록으로 복사할 때 사용.
  • 특징:
    • 바이트 단위로 데이터를 복사.
    • 원본과 대상의 메모리 크기를 정확히 계산해야 함.
    • 원시 데이터 복사에 적합.

 

사용법

void* memcpy(void* dest, const void* src, size_t num);

 

  • dest: 복사 대상 메모리 블록의 시작 주소.
  • src: 복사할 원본 메모리 블록의 시작 주소.
  • num: 복사할 바이트 수.

 

 

예제

int src[5] = {1, 2, 3, 4, 5};
int dest[5];
memcpy(dest, src, sizeof(src)); // src의 데이터를 dest로 복사

 

 

(예제코드 1) 1차원 배열 복사

 

#include <stdio.h> 
#include <string.h>
int main() {
    int source[10] = {1,2,3,4,5,6,7,8,9,10}; // 원본
    int destination[10]; // 대상
    // memcpy를 사용하여 데이터 복사
    memcpy(destination, source, sizeof(source));
    for (int i = 0; i < 10; i++) { // 1 2 3 4 5 6 7 8 9 10
        printf("%d ", destination[i]); 
    } 
    printf("\n");
    return 0;
}

 

 

 

 

(예제코드2) 2차원 배열 복사 

#include <stdio.h> 
#include <string.h>
int main() {
    int rows = 3; // 행 수
    int cols = 4; // 열 수
    // 원본
    int source[3][4] = { 
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    // 대상
    int destination[3][4];
    // 데이터 복사
    memcpy(destination, source, sizeof(source));
    // 복사된 데이터 출력
    printf("복사된 데이터:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) { 
            printf("%d ", destination[i][j]);
        } 
        printf("\n");
    }
    return 0;
}

 

 

 

 

 

 

 

 

 

 


memcmp

  • 두 메모리 블록의 첫 번째 바이트부터 n번째 바이트까지 비교
  • 두 메모리 블록을 바이트 단위로 비교하고, 그 결과에 따라 양의 정수, 0, 또는 음의 정수를 반환

* 주의: 같을 때 0 return

 

 

사용법

#include <string.h>

int memcmp(const void* ptr1, const void* ptr2, size_t n);

 

  • ptr1: 비교할 첫 번째 메모리 블록의 포인터.
  • ptr2: 비교할 두 번째 메모리 블록의 포인터.
  • n: 비교할 바이트 수 (비교할 메모리의 크기).

 

 

return

 

  • 0: 두 메모리 블록의 내용이 같으면 0을 반환.
  • 양의 정수: 첫 번째 메모리 블록(ptr1)이 두 번째 메모리 블록(ptr2)보다 더 클 경우 양의 값을 반환.
  • 음의 정수: 첫 번째 메모리 블록(ptr1)이 두 번째 메모리 블록(ptr2)보다 더 작을 경우 음의 값을 반환.

 

 

(예시 코드)  두 구조체 비교 

struct Person {
    int age;
    char name[20];
};

struct Person p1 = {30, "Alice"};
struct Person p2 = {30, "Alice"};

if (memcmp(&p1, &p2, sizeof(struct Person)) == 0) {
    printf("Structures are equal.\n");
} else {
    printf("Structures are not equal.\n");
}

 

 

예시

#include <stdio.h>
#include <string.h>
int main() {
    int arr1[] = {1, 2, 3, 4, 5};
    int arr2[] = {1, 2, 3, 4, 6};
    int arr3[] = {1, 2, 3, 4, 5};
    
    // 배열 arr1과 arr2 비교
    int cmp_result1 = memcmp(arr1, arr2, sizeof(arr1)); 
    if (cmp_result1 == 0) {
        printf("arr1과 arr2는 같습니다.\n");
    } else {
        printf("arr1과 arr2는 다릅니다.\n");
    }
    // 배열 arr1과 arr3 비교
    int cmp_result2 = memcmp(arr1, arr3, sizeof(arr1)); 
    if (cmp_result2 == 0) {
        printf("arr1과 arr3는 같습니다.\n");
    } else {
        printf("arr1과 arr3는 다릅니다.\n");
    }
    return 0;
}

 

실행결과

arr1과 arr2는 다릅니다.
arr1과 arr3는 같습니다.

 

 

 

 

Tip | memcmp vs strcmp

  • memcmp는 메모리 블록을 바이트 단위로 비교하며, strcmp는 문자열을 비교할 때 사용된다.
    • strcmp는 문자열이 null 종료된 문자열이어야만 사용할 수 있으며, 문자열의 길이를 자동으로 판단하여 비교한다.
    • memcmp는 null 종료 여부와 관계없이 지정된 바이트 수만큼 비교하므로, 문자열뿐만 아니라 임의의 메모리 블록에 대해 비교할 수 있다.