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 종료 여부와 관계없이 지정된 바이트 수만큼 비교하므로, 문자열뿐만 아니라 임의의 메모리 블록에 대해 비교할 수 있다.
'IVS > C 프로그래밍' 카테고리의 다른 글
[C] 지역변수(local), 전역변수(global), 정적변수(static) (2) | 2025.01.13 |
---|---|
[C] 구조체 - 바이트 패딩(Byte Padding) (1) | 2025.01.13 |
[C] 메모리 관련 (0) | 2025.01.13 |
[C] const 키워드 (0) | 2025.01.13 |
[C/C++] 배열 초기화 - memset, fill (0) | 2025.01.13 |