C 언어에서 동적 메모리 할당은 프로그램 실행 중에 필요한 만큼의 메모리를 효율적으로 확보할 수 있게 해주는 핵심 기능입니다. 대표적인 함수로 calloc()과 malloc()이 있으며, 두 함수는 모두 stdlib.h 헤더 파일에 선언되어 있습니다. 이 글에서는 두 함수의 개념, 문법, 사용 예제와 함께 각각의 특징을 자세히 살펴보겠습니다.
calloc() 함수란?
calloc()은 'contiguous allocation(연속 할당)'을 의미하는 함수로, malloc()과 유사하게 작동하지만 동일한 크기의 여러 메모리 블록을 한 번에 할당한다는 점이 다릅니다. 또한 할당된 모든 바이트를 0으로 초기화해 주는 장점이 있습니다.
calloc() 문법
void *calloc(size_t number, size_t size);
매개변수 설명은 다음과 같습니다.
- number − 할당할 배열 요소의 개수입니다.
- size − 할당할 메모리의 크기(바이트 단위)입니다.
calloc() 사용 예제
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, s = 0;
p = (int*) calloc(n, sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);
return 0;
}실행 결과
Enter elements of array : 2 24 35 12 Sum : 73
코드 설명
위 프로그램에서는 calloc()을 통해 메모리 블록을 할당합니다. 포인터 변수가 NULL이면 메모리 할당에 실패한 것이므로 에러 메시지를 출력하고 프로그램을 종료합니다. 할당이 성공하면 사용자로부터 배열의 네 개 요소를 입력받아 그 합계를 계산하여 출력합니다.
p = (int*) calloc(n, sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}malloc() 함수란?
malloc()은 요청된 크기만큼의 바이트를 할당하고, 할당된 메모리의 첫 번째 바이트를 가리키는 포인터를 반환합니다. 만약 메모리 할당에 실패하면 NULL 포인터를 반환합니다. 참고로 malloc()은 할당된 메모리를 초기화하지 않으므로 초기값이 필요하다면 별도의 초기화 작업이 필요합니다.
malloc() 문법
pointer_name = (cast-type*) malloc(size);
구성 요소 설명은 다음과 같습니다.
- pointer_name − 포인터에 부여하는 임의의 이름입니다.
- cast-type − malloc()으로 할당한 메모리를 변환(cast)할 데이터 타입입니다.
- size − 할당할 메모리의 크기(바이트 단위)입니다.
malloc() 사용 예제
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);
return 0;
}실행 결과
Enter elements of array : 32 23 21 8 Sum : 84
코드 설명
위 프로그램에서는 네 개의 변수를 선언하며, 그중 포인터 변수 *p가 malloc()으로 할당받은 메모리를 저장합니다. 사용자가 배열 요소를 입력하면 해당 요소들의 합이 계산되어 화면에 출력됩니다.
int n = 4, i, *p, s = 0;
p = (int*) malloc(n * sizeof(int));
if(p == NULL) {
printf("\nError! memory not allocated.");
exit(0);
}
printf("\nEnter elements of array : ");
for(i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nSum : %d", s);calloc()과 malloc()의 주요 차이점
두 함수의 차이를 한눈에 파악할 수 있도록 정리하면 다음과 같습니다.
- 초기화 여부: calloc()은 할당된 메모리를 0으로 초기화하지만, malloc()은 초기화하지 않고 쓰레기 값(garbage value)이 남아 있습니다.
- 인자 개수: calloc()은 요소 개수와 크기 두 개의 인자를 받고, malloc()은 총 바이트 크기 하나의 인자만 받습니다.
- 속도: 초기화 과정이 없는 malloc()이 일반적으로 더 빠릅니다.
- 안전성: 0으로 초기화되는 calloc()이 예측 가능한 동작 면에서 더 안전합니다.
결론적으로, 초기값이 0인 메모리가 필요하거나 여러 블록을 한 번에 할당할 때는 calloc()을, 속도가 중요하고 직접 초기화할 계획이라면 malloc()을 사용하는 것이 좋습니다. 어떤 함수를 선택하든 반환값이 NULL인지 반드시 확인하여 메모리 할당 실패 상황에 대비하는 것이 안전한 프로그래밍의 기본입니다.