본문 바로가기
개발/C, C++

[C] malloc() calloc() 차이점, 동적메모리할당

by candosh 2024. 11. 26.

 

C 언어에서 동적 메모리 할당은 프로그램 실행 중 필요한 메모리를 런타임에 동적으로 할당할 수 있게 해준다. 이 작업은 힙 메모리(Heap Memory)에서 이루어지며, 대표적으로 malloc()과 calloc() 함수가 사용된다.

 


1. malloc()

malloc()(Memory Allocation)은 메모리를 동적으로 할당하는 함수이다. 할당된 메모리는 초기화되지 않은 상태로 제공된다.

 

형태

void* malloc(size_t size);
  • size_t size: 할당할 메모리 크기를 바이트 단위로 지정한다.
  • 반환값: 성공 시 메모리의 시작 주소를 가리키는 포인터를 반환하며, 실패 시 NULL을 반환한다.

특징

  1. 초기화되지 않은 메모리를 할당하므로, 할당된 메모리의 값은 쓰레기 값(Garbage Value)을 포함할 수 있다.
  2. 메모리를 성공적으로 할당했더라도, 사용 후 반드시 free()를 호출해 메모리를 해제해야 한다.

사용 예시

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr;

    // 정수 5개를 위한 메모리 할당
    arr = (int*)malloc(5 * sizeof(int));
    if (arr == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    // 배열 초기화 및 출력
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
        printf("%d ", arr[i]);
    }

    // 메모리 해제
    free(arr);

    return 0;
}

2. calloc()

calloc()(Contiguous Allocation)은 malloc()과 유사하지만, 할당된 메모리를 0으로 초기화한다.

 

형태

void* calloc(size_t num, size_t size);
  • size_t num: 할당할 요소의 개수.
  • size_t size: 각 요소의 크기를 바이트 단위로 지정.
  • 반환값: 성공 시 메모리의 시작 주소를 가리키는 포인터를 반환하며, 실패 시 NULL을 반환한다.

특징

  1. 메모리 할당과 동시에 모든 바이트를 0으로 초기화한다.
  2. 다차원 배열이나 초기화가 필요한 경우에 유용하다.

사용 예시

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr;

    // 정수 5개를 위한 메모리 할당 및 초기화
    arr = (int*)calloc(5, sizeof(int));
    if (arr == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    // 초기화된 배열 출력
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); // 모든 값이 0으로 초기화됨
    }

    // 메모리 해제
    free(arr);

    return 0;
}

3. malloc()과 calloc()의 차이점

특징malloc()calloc()

초기화 여부 초기화하지 않음 (쓰레기 값 포함) 모든 메모리를 0으로 초기화
인자 형식 한 번에 전체 크기를 전달 요소 개수와 각 요소의 크기를 전달
속도 초기화 과정이 없으므로 더 빠름 초기화 과정이 있어 상대적으로 느림
사용 예 초기값이 필요하지 않은 데이터 처리 초기화가 필요한 배열이나 구조체