때로는 필요에 따라 포인터의 위치는 유지하면서 크기를 바꾸고 싶은 경우가 발생한다. 예를 들어 현재 생성되어있는 int형 메모리가 20개 정도인데 데이터가 30개가 들어온다고 가정하자. 이런 경우 기존의 20개 크기의 동적 메모리를 해제하고 다시 30개 크기의 동적 메모리를 생성해야 할까? 만약 그렇다면 매번 크기가 커질 때마다 메모리 해제와 생성을 반복해야 한다. 이런 때에 유용한 함수가 동적 메모리의 크기를 바꿔주는 realloc이다.
realloc의 원형은 다음과 같다.
void *realloc(void* block, size_t size);
여기서 void형 포인터 block에는 크기를 바꿀 메모리에 대한 포인터를, size는 바꿀 메모리의 크기를 말한다.
다음 예제 프로그램을 통해서 realloc에 대해 살펴보자. 인원이 총 5명인 한 학급에 대한 평균 성적을 가지고 있다고 가정해 보자. 이때 전학생이 3명 들어 왔을 경우 성적을 관리하기 위한 방법과 다시 4명이 전학간 경우 성적을 관리하기 위한 방법을 간단하게 프로그램으로 해보았다.
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void PrintGrade(int *p, int nPerson); // 총원, 번호, 성적을 출력하는 함수
5
6 int main()
7 {
8 int i;
9 int *pGrade = (int*)calloc(5,sizeof(int)); // 메모리 할당
10
11 // 메모리 할당에 실패했을 경우 프로그램 종료
12 if(!pGrade)
13 return EXIT_FAILURE;
14
15 // 성적 대입
16 pGrade[0]=95;
17 pGrade[1]=50;
18 pGrade[2]=65;
19 pGrade[3]=85;
20 pGrade[4]=100;
21
22 PrintGrade(pGrade,5); // 5명인 경우
23
24 // 전학생 3명을 포함한 성적 공간 재할당
25 pGrade = (int*)realloc(pGrade,8*sizeof(int));
26
27 pGrade[5]=25;
28 pGrade[6]=70;
29 pGrade[7]=90;
30
31 PrintGrade(pGrade,8); // 8명인 경우
32
33 // 전학생 4명을 제외한 성적 공간 재할당
34 pGrade = (int*)realloc(pGrade,4*sizeof(int));
35
36 PrintGrade(pGrade,4); // 4명인 경우
37
38 free(pGrade);
39
40 return EXIT_SUCCESS;
41 }
42
43 void PrintGrade(int *p, int nPerson)
44 {
45 int i;
46
47 printf("총원 %d명\n",nPerson);
48 printf("==========================================\n");
49 printf("번호 : ");
50 for(i=0;i!=nPerson;++i)
51 printf("%3d ",i+1);
52 printf("\n성적 : ");
53 for(i=0;i!=nPerson;++i)
54 printf("%3d ",p[i]);
55 printf("\n==========================================\n");
56 }
위의 예제를 통해서 알수 있는 것은 realloc으로 동적 메모리의 크기를 변경하더라도 이전에 들어있던 데이터의 값은 변하지 않는다는 것이다. 실행 결과를 보면 5명에서 8명으로 인원이 변하여도 성적이 그대로 출력됨을 알 수 있다. |
|