C 표준 라이브러리의 메모리 할당 함수 void *calloc(size_t nitems, size_t size)는 요청한 크기만큼의 메모리를 할당하고, 해당 메모리의 시작 주소를 가리키는 포인터를 반환합니다.
malloc과 calloc의 가장 큰 차이점은 초기화 여부입니다. malloc은 할당받은 메모리를 0으로 초기화하지 않고 쓰레기 값(garbage value)이 그대로 남아 있지만, calloc은 할당된 모든 메모리를 0으로 자동 초기화해 줍니다.
C 언어의 메모리 할당 방식
C 언어에서 메모리는 크게 두 가지 방식으로 할당할 수 있습니다.
1. 정적 메모리 할당 (Static Memory Allocation)
컴파일 시점에 메모리가 할당되는 방식입니다. 한 번 할당된 메모리는 프로그램 실행 중에 크기를 변경할 수 없으므로, 필요한 양보다 적으면 메모리 부족 문제가 발생하고, 많으면 메모리가 낭비되는 단점이 있습니다.
2. 동적 메모리 할당 (Dynamic Memory Allocation)
프로그램 실행 중에 사용자의 요구 사항에 맞춰 필요한 만큼 메모리를 유연하게 확보하는 방식입니다. 정적 할당의 단점을 보완하며, 실무에서 효율적인 메모리 관리를 위해 널리 사용됩니다.
C 표준 라이브러리에서 동적 메모리 관리를 위해 제공하는 대표적인 함수는 다음과 같습니다.
- malloc() : 지정한 바이트 수만큼 메모리 할당
- calloc() : 여러 개의 요소를 위한 메모리를 할당하고 0으로 초기화
- realloc() : 이미 할당된 메모리의 크기 재조정
- free() : 할당된 메모리 해제
calloc() 함수의 특징
- 런타임에 연속적인(continuous) 메모리 블록을 할당하는 데 사용됩니다.
- 여러 개의 데이터를 담는 배열 처리에 특화되어 있습니다.
- 할당이 성공하면 해당 메모리의 기본 주소(base address)를 가리키는 void 포인터를 반환하며, 실패하면 NULL을 반환합니다.
calloc() 함수의 기본 구문은 다음과 같습니다.
void *calloc (요소의 개수, 각 요소의 바이트 크기)
calloc() 사용 예시
다음 예시는 calloc() 함수의 기본적인 사용 방법을 보여줍니다.
int *ptr; ptr = (int *) calloc (500, 2);
위 코드는 크기가 2바이트인 메모리 블록 500개를 연속적으로 할당합니다. 따라서 총 할당되는 메모리 크기는 1000바이트입니다.
일반적으로는 자료형의 크기를 직접 숫자로 지정하기보다 sizeof 연산자를 사용하는 것이 안전하고 이식성이 좋습니다.
int *ptr; ptr = (int *) calloc (n, sizeof(int));
실전 예제 프로그램
다음은 calloc()을 이용한 동적 메모리 할당으로, 입력받은 요소들 중 짝수의 합과 홀수의 합을 각각 계산하는 C 프로그램입니다.
#include<stdio.h>
#include<stdlib.h>
void main(){
// 변수 및 포인터 선언 //
int i, n;
int *p;
int even = 0, odd = 0;
// calloc을 사용하여 기본 주소 p 할당 //
p = (int *) calloc (n, sizeof(int));
// 요소의 개수 입력 받기 //
printf("Enter the number of elements : ");
scanf("%d", &n);
/* 출력 전 확인 작업 -
메모리가 성공적으로 할당되었는지 반드시 검사해야 하므로
if문을 사용합니다 */
if (p == NULL){
printf("Memory not available");
exit(0);
}
// for문을 이용해 각 위치에 요소 저장 //
printf("The elements are : \n");
for(i = 0; i < n; i++){
scanf("%d", p + i);
}
// 짝수와 홀수의 합 계산 //
for(i = 0; i < n; i++){
if(*(p + i) % 2 == 0){
even = even + *(p + i);
} else {
odd = odd + *(p + i);
}
}
printf("The sum of even numbers is : %d\n", even);
printf("The sum of odd numbers is : %d\n", odd);
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter the number of elements : 4 The elements are : 12 56 23 10 The sum of even numbers is : 78 The sum of odd numbers is : 23
입력된 값 중 짝수(12, 56, 10)의 합은 78, 홀수(23)의 합은 23으로 정상적으로 계산된 것을 확인할 수 있습니다. 이처럼 calloc()은 실행 중에 필요한 만큼 메모리를 안전하게 확보하고 0으로 초기화해 주기 때문에, 배열 기반의 동적 데이터 처리에 매우 유용한 함수입니다.