본문 바로가기
카테고리 없음

C 메모리 함수 비교 (할당, 초기화, 사용법)

by info95686 2025. 10. 3.

C 메모리 함수 비교
C 메모리 함수 비교

C언어에서 동적 메모리 관리는 프로그램의 유연성과 성능을 크게 좌우하는 핵심 요소입니다. 특히 malloccalloc은 가장 널리 사용되는 메모리 할당 함수로, 표면적으로는 비슷해 보이지만 내부 동작 방식과 초기화 처리, 성능 측면에서 중요한 차이가 있습니다. 초보자는 두 함수를 혼동하기 쉽지만, 어떤 상황에서 어떤 함수를 사용해야 하는지를 이해하는 것이 효율적인 메모리 관리의 첫걸음입니다. 이번 글에서는 C언어의 대표적인 메모리 할당 함수인 malloc과 calloc을 중심으로 할당 방식, 초기화 처리, 사용법 차이를 구체적인 예제와 함께 살펴보겠습니다.

malloc 함수와 메모리 할당 방식

malloc은 "memory allocation"의 줄임말로, 지정한 크기만큼의 메모리를 힙(heap) 영역에 할당해주는 함수입니다. 기본 원형은 다음과 같습니다.

void* malloc(size_t size);
  • size: 할당하고자 하는 메모리의 크기(바이트 단위)
  • 반환값: 성공 시 메모리 블록의 시작 주소(포인터), 실패 시 NULL

예를 들어, 정수 10개를 담을 배열을 동적으로 만들고 싶다면 다음과 같이 작성합니다.

int *arr = (int*) malloc(10 * sizeof(int));

이 경우 40바이트(4바이트 × 10)의 메모리가 할당되고, arr는 그 시작 주소를 가리키게 됩니다. 하지만 malloc의 중요한 특징은 할당된 메모리를 초기화하지 않는다는 점입니다. 즉, 메모리 공간에는 이전에 다른 프로그램이나 프로세스가 사용했던 쓰레기 값이 남아 있을 수 있습니다. 따라서 malloc으로 확보한 메모리를 사용하기 전에 직접 초기화가 필요합니다.

for (int i = 0; i < 10; i++) {
    arr[i] = 0;
}

malloc은 빠른 메모리 할당이 장점입니다. 불필요하게 초기화를 하지 않기 때문에 성능 면에서 효율적일 수 있지만, 초기화가 필요한 경우라면 프로그래머가 직접 처리해야 한다는 단점이 있습니다.

calloc 함수와 메모리 초기화 차이

calloc은 "contiguous allocation"의 줄임말로, 메모리를 할당할 뿐만 아니라 자동으로 0으로 초기화까지 수행합니다. 기본 원형은 다음과 같습니다.

void* calloc(size_t nmemb, size_t size);
  • nmemb: 할당할 요소의 개수
  • size: 각 요소의 크기(바이트 단위)
  • 반환값: 성공 시 메모리 블록의 시작 주소, 실패 시 NULL

예를 들어, 정수 10개짜리 배열을 동적으로 할당하고 싶다면 다음과 같이 작성합니다.

int *arr = (int*) calloc(10, sizeof(int));

위 코드에서는 10 × 4바이트 = 40바이트의 메모리가 할당되고, 모든 값은 0으로 초기화됩니다. malloc과는 달리 별도의 루프를 돌며 초기화할 필요가 없습니다.

calloc이 유리한 상황은 다음과 같습니다.

  • 배열을 생성하고 모든 요소를 0으로 시작하고 싶을 때
  • 문자열 버퍼를 확보하면서 null 초기화를 동시에 하고 싶을 때
  • 예측할 수 없는 초기 쓰레기 값으로 인한 버그를 미리 차단하고 싶을 때

단점은 malloc보다 상대적으로 속도가 느릴 수 있다는 점입니다. 이유는 내부적으로 초기화를 수행하기 때문입니다. 하지만 현대 컴퓨터에서는 이 성능 차이가 크게 문제되지 않는 경우가 많습니다.

malloc vs calloc 사용법과 선택 기준

malloc과 calloc을 비교해보면 차이는 크게 세 가지입니다: 인자, 초기화 여부, 성능입니다.

  • 인자 차이
    • malloc: 바이트 단위 크기를 하나의 인자로 받음
    • calloc: 개수와 크기 두 개의 인자를 받아 곱한 만큼의 메모리를 할당
  • 초기화 여부
    • malloc: 초기화하지 않음 → 쓰레기 값 존재
    • calloc: 0으로 자동 초기화
  • 성능 차이
    • malloc: 초기화를 하지 않기 때문에 상대적으로 빠름
    • calloc: 초기화를 수행하므로 약간 느릴 수 있음

사용 예제 비교:

// malloc 사용 예시
int *a = (int*) malloc(5 * sizeof(int));
for (int i = 0; i < 5; i++) {
    a[i] = 0;  // 초기화 필요
}

// calloc 사용 예시
int *b = (int*) calloc(5, sizeof(int));
// 이미 0으로 초기화되어 있어 바로 사용 가능

메모리를 다 사용한 뒤에는 반드시 free()를 호출하여 해제해야 합니다.

free(a);
free(b);

선택 기준 요약

  • 초기화가 꼭 필요하고 코드 간결성이 중요하다면 → calloc
  • 초기화가 필요하지 않고 성능을 우선한다면 → malloc
  • 대규모 배열을 다룰 때 초기화가 필요하다면 calloc이 유리하지만, 대규모 고성능 시스템에서는 malloc 후 memset으로 초기화하는 방식이 더 효율적일 수 있음

결론: malloc과 calloc의 올바른 활용

C언어에서 malloc과 calloc은 동적 메모리 할당의 핵심 함수입니다. 두 함수 모두 메모리를 힙 영역에 할당하고 포인터를 반환하지만, malloc은 초기화를 하지 않고, calloc은 0으로 초기화한다는 점이 가장 큰 차이입니다. 초기화 여부와 성능 차이를 고려하여 적절히 선택하면, 효율적이면서도 안전한 프로그램을 작성할 수 있습니다.

  • malloc: 빠르지만 초기화 필요
  • calloc: 안전하게 0으로 초기화, 약간 느릴 수 있음
  • free(): 반드시 해제해야 메모리 누수 방지

초보자일수록 calloc을 사용해 안정성을 확보하고, 점차 상황에 맞게 malloc과 calloc을 선택하는 습관을 기르는 것이 좋습니다. 메모리 관리는 C언어의 핵심 주제 중 하나이므로, 이러한 차이를 정확히 이해하는 것이 탄탄한 프로그래밍 실력을 기르는 출발점이 됩니다.