[C/C++] 배열 메모리 초기화(리셋) 및 복사(reset array & copy array)
안녕하세요 JollyTree입니다 (•̀ᴗ•́)و
이번 포스팅은 정수형 배열, 문자형 배열, 구조체형 배열의 초기화(리셋)와 복사 방법입니다. 작성한 예제를 보면서 정리하겠습니다.
예제(Example):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <memory.h>
#include <string.h>
typedef struct EXAM_TAG
{
int number;
char name[10];
}EXAM;
void PRINT(int* num, char* buf, EXAM *exam)
{
int i;
printf("num2 = ");
for (i = 0; i < 5; i++)
printf("%d ", num[i]);
printf("\n");
printf("buf2 = %s\n", buf);
//구조체 값 출력
printf("exam2[0].number = %d\n", exam[0].number);
printf("exam2[0].name = %s\n", exam[0].name);
printf("exam2[1].number = %d\n", exam[1].number);
printf("exam2[1].name = %s\n", exam[1].name);
puts("\n");
}
int main()
{
int num1[5] = { 10, 20, 30, 40, 50 }; //초기값 설정
int num2[5];
char buf1[50] = "hello maincodes !";
char buf2[50] = "";
int i;
EXAM exam1[2];
EXAM exam2[2];
exam1[0].number = 100;
strcpy(exam1[0].name, "the codes");
exam1[1].number = 200;
strcpy(exam1[1].name, "maincodes");
/* 1. 배열의 복사
*/
//for문을 이용한 복사
//
for (i = 0; i < 5; i++)
num2[i] = num1[i];
for (i = 0; i < strlen(buf1); i++)
buf2[i] = buf1[i];
//출력
PRINT(num2, buf2, exam1);
//memset함수를 이용하여 메모리 배열 메모리 초기화
memset(num2, 0, sizeof(num2));
memset(buf2, 0, sizeof(buf2));
//memcpy를 이용한 복사
//
memcpy(num2, num1, sizeof(num1));
memcpy(buf2, buf1, sizeof(buf1));
memcpy(&exam2, exam1, sizeof(exam1)); //구조체 복사
PRINT(num2, buf2, exam2);
/* 2. 메모리 초기화(reset)
*/
//for문을 이용한 초기화
for (i = 0; i < 5; i++)
num1[i] = 0;
//memset을 이용한 초기화
memset(num2, 0, sizeof(num1)); //배열
memset(buf2, 0, sizeof(buf1)); //배열
memset(&exam2, 0, sizeof(exam2)); //구조체 초기화
PRINT(num2, buf2, exam2);
return 0;
}
|
cs |
실행결과(Output):
/* 1. 배열의 복사
*/
예제는 for 문과 memcpy 함수를 이용하여 배열을 복사하는 예제를 보여줍니다. for 문을 이용한 복사는 인덱스 i를 증가시켜 원소 하나하나를 대상 배열에 복하는 방법입니다. 그런데 이 방법은 구조체와 같이 여러 멤버 변수로 구성되어 있는 경우라면 멤버변수 마다 원소를 복사해주는 작업을 해야 하므로 많이 시간이 오래 걸리는 방법입니다.
memcpy 함수는 원소 하나하나 복사를 하지 않더라도 메모리의 복사 시작 시점과 복사할 크기만을 정해 주면 한 줄로 배열과 구조체를 쉽게 복사할 수 있습니다.
//memcpy를 이용한 복사
memcpy(num2, num1, sizeof(num1)); //원소 0~4까지 복사
memcpy(buf2, buf1, sizeof(buf1));
memcpy(&exam2, exam1, sizeof(exam1)); //구조체 복사
구조체를 복사할 때에는 &연산자를 이용하여 구조체 변수를 복사합니다.
/* 2. 메모리 초기화(reset)
*/
배열을 초기화 하는 방법 또한 for문을 이용하여 원소를 한개씩 대상 배열에 복사하는 방법이 있긴 합니다. 하지만 마찬가지로 구조체 배열의 경우 멈버 수에 따라 복잡하고 불필요한 과정이 필요하므로 이때에는 memset 함수를 사용하는 것이 정말 편리합니다.
//memset을 이용한 초기화
memset(num2, 0, sizeof(num2)); //배열 원소들을 모두 0으로 초기화
memset(buf2, 0, sizeof(buf2)); //배열
memset(&exam2, 0, sizeof(exam2)); //구조체 초기화
구조체 초기화 역시 &연산자를 이용하여 구조체 변수의 주소를 지정하여 구조체의 시작부터 전체 크기까지 메모리를 초기화 합니다.
오늘은 배열의 메모리를 초기화(리셋)하는 방법과 복사를 쉽게 하는 방법에 대해 정리하였습니다.
이상 JollyTree였습니다 (•̀ᴗ•́)و