동적 메모리 할당 크기 변경: C 언어의 realloc
함수 활용 예제
본 아티클에서는 C 언어에서 동적 메모리 할당 크기를 변경하는 방법에 대해 설명합니다. 이를 위해 realloc
함수를 사용하는 예제 코드인 'realloc_memory.c'를 준비했습니다.
C 언어에서 메모리를 동적으로 할당하거나 해제하는 것은 상당히 중요한 작업입니다. malloc
함수를 사용하여 메모리를 동적으로 할당할 수 있으며, free
함수를 사용하여 메모리를 해제할 수 있습니다. 그러나 때로는 이미 할당된 메모리의 크기를 변경해야 하는 경우가 있습니다. 이런 경우에는 realloc
함수를 사용합니다.
아래는 realloc
함수를 사용하여 동적 메모리 할당 크기를 변경하는 예제입니다.
코드: realloc_memory.c
#define _CRT_SECURE_NO_WARNINGS // Visual Studio에서 경고 메시지를 무시하도록 하는 매크로
#include <stdio.h> // 표준 입출력 함수를 사용하기 위해 stdio.h 헤더 파일을 포함
#include <stdlib.h> // malloc, realloc 등의 메모리 관리 함수를 사용하기 위해 stdlib.h 헤더 파일을 포함
int main(void)
{
int* arr = (int*)malloc(5 * sizeof(int)); // 정수형 포인터 arr를 선언하고, 동적 메모리 할당을 통해 int형 변수 5개 크기만큼의 메모리를 할당
if (arr == NULL) // 메모리 할당이 실패한 경우
{
printf("메모리 할당 실패\n"); // 에러 메시지 출력
return 1; // 프로그램 종료
}
for (int i = 0; i < 5; i++) // arr 배열에 0부터 8까지의 2의 배수를 저장
{
arr[i] = i * 2;
}
int* newArr = (int*)realloc(arr, 10 * sizeof(int)); // arr의 크기를 10개의 int 크기로 늘리는 realloc 함수 사용
if (newArr == NULL) // 메모리 재할당이 실패한 경우
{
printf("메모리 재할당 실패\n"); // 에러 메시지 출력
free(arr); // 원래 할당한 메모리 해제
return 1; // 프로그램 종료
}
arr = newArr; // arr 포인터에 재할당된 메모리의 주소 할당
for (int i = 5; i < 10; i++) // 새롭게 할당된 arr 배열의 나머지 부분에 10부터 18까지의 2의 배수를 저장
{
arr[i] = i * 2;
}
for (int i = 0; i < 10; i++) // arr 배열에 저장된 모든 원소 출력
{
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // 동적으로 할당했던 메모리 해제
return 0; // 프로그램 정상 종료
}
이 코드는 처음에 5개의 int
타입 원소를 저장할 수 있는 메모리를 동적으로 할당합니다. 그 다음 각 원소에 2의 배수를 저장하고, realloc
함수를 사용하여 메모리 크기를 10개의 int
타입 원소를 저장할 수 있도록 확장합니다. 메모리 재할당이 성공하면, 새롭게 확장된 부분에도 2의 배수를 저장합니다. 그 후, 모든 원소를 출력하고, 동적으로 할당했던 메모리를 해제합니다.
이 코드를 실행하면 다음과 같은 출력을 볼 수 있습니다:
0 2 4 6 8 10 12 14 16 18
이처럼 realloc
함수는 이미 할당된 메모리의 크기를 변경하는 데 사용됩니다. 이 함수를 사용하면 메모리 사용 효율을 높이고, 필요에 따라 동적으로 메모리 크기를 조절할 수 있어서 프로그램의 유연성을 크게 향상시킬 수 있습니다.
하지만 realloc
함수 사용 시 주의할 점이 있습니다. realloc
은 새로운 메모리 공간을 할당하고, 기존 데이터를 복사한 뒤, 기존 메모리를 해제합니다. 그렇기 때문에, 이 과정에서 메모리 재할당이 실패하면 원래 메모리 공간의 주소를 잃어버릴 수 있으므로, 항상 재할당이 성공했는지 확인하는 코드를 작성해야 합니다.
int* newArr = (int*)realloc(arr, 10 * sizeof(int));
if (newArr == NULL)
{
printf("메모리 재할당 실패\n");
free(arr);
return 1;
}
arr = newArr;
이 예제에서 볼 수 있듯이, realloc
함수는 새로운 메모리 주소를 반환하므로, 이를 다른 포인터 변수에 저장합니다. 그리고 이 새로운 포인터가 NULL인지 확인하여 재할당이 성공했는지 확인합니다. 만약 realloc
이 실패하면, 함수는 NULL을 반환하고, 기존 메모리는 변경되지 않습니다. 이 경우에는 메모리 누수를 방지하기 위해 원래 할당한 메모리를 free
함수로 해제해야 합니다.
동적 메모리 관리는 C 언어 프로그래밍에서 중요한 개념입니다. 특히, realloc
함수를 통해 이미 할당된 메모리의 크기를 유연하게 변경할 수 있으므로, 메모리를 효율적으로 관리할 수 있습니다. 다만, realloc
함수 사용 시에는 메모리 재할당의 성공 여부를 항상 검사해야 하며, 실패한 경우에는 적절한 메모리 해제 처리를 해주어야 합니다.