C언어/stdlib.h

[C언어] calloc 함수 (초기화된 heap 메모리 할당)

아무일도없었다 2023. 3. 2. 21:29

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 초기화된 동적메모리(Heap Memory) 할당을 받기 위해 사용한다.

헤더

#include <stdlib.h>

※ 함수 사용 시 stdlib.h 파일을 include 하지 않는다면 컴파일 시 error 발생 ※


함수

void* calloc(size_t NumOfElements, size_t SizeOfElements);

파라미터

  • size_t NumOfElements
    • 메모리를 할당할 elements(요소)의 수
      (※ <보통의 경우> 동적메모리 할당받는 변수의 배열 크기를 입력하며, 배열이 아닐 경우 1을 입력한다.)
  • size_t SizeOfElements
    • 메모리를 할당할 elements(요소)의 크기
      (※ <보통의 경우> 동적메모리 할당받는 변수 type의 크기를 입력한다.)

반환값

성공 시   유효한 포인터 주소를 반환한다.
실패 시  NULL을 반환한다.

 


잡학지식

calloc 함수를 통해서 할당받은 메모리 영역은 모든 영역이 0으로 초기화가 되어있다.

 

추가로 malloc +memset 의 속도보다 calloc 함수를 통한 초기화된 heap 영역 할당하는 속도가 더 빠르다.

 

따라서 초기화가 반드시 필요한 경우에는 malloc + memset 보다 calloc 함수 사용을 추천한다.

 


 

calloc 함수를 사용하면 malloc 보다 struct[] 혹은 char[] 같은 배열 변수를 비교적 편하게(?) 할당받을 수 있다.

typedef struct {
    int a;
    int b;
} my_str_t;

// malloc의 경우 my_str_t[30] 할당 시 (초기화 안 됨)
my_str_t *malloc_var = (my_str_t *)malloc(sizeof(my_str_t) * 30);

// calloc의 경우 my_str_t[30] 할당 시 (초기화)
my_str_t *calloc_var = (my_str_t *)calloc(30, sizeof(my_str_t));

 


 

calloc을 사용하여 크기가 0인 메모리를 할당을 받으려고 할 경우 malloc과 같은 결과가 나온다. (malloc 참고)

 

또한 calloc 함수 사용시 반드시 반환받은 메모리(포인터 주소)의 사용을 마친 후 free() 함수를 사용하여 해제해야 한다.


 

<소스 코드>

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

#define HEAP_SIZE 10

int main() {
    int i;
    char *_malloc_heap = NULL;
    char *_calloc_heap = NULL;

    _malloc_heap = (char *)malloc(HEAP_SIZE);
    if(_malloc_heap == NULL) {
        printf("malloc failed\n");
        exit(1);
    }

    _calloc_heap = (char *)calloc(1, HEAP_SIZE);
    if(_calloc_heap == NULL) {
        free(_malloc_heap);
        printf("calloc failed\n");
        exit(2);
    }

    printf("[malloc] ");
    for(i = 0; i < HEAP_SIZE; i++) {
        printf("%02x ", (unsigned char)_malloc_heap[i]);
    }
    printf("\n");

    printf("[calloc] ");
    for(i = 0; i < HEAP_SIZE; i++) {
        printf("%02x ", (unsigned char)_calloc_heap[i]);
    }
    printf("\n");
    
    free(_malloc_heap);
    free(_calloc_heap);

    return 0;
}

 

※ 실행 결과

[malloc] f0 60 c1 00 00 00 00 00 50 01
[calloc] 00 00 00 00 00 00 00 00 00 00

 

반응형