사용범위
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을 입력한다.)
- 메모리를 할당할 elements(요소)의 수
- size_t SizeOfElements
- 메모리를 할당할 elements(요소)의 크기
(※ <보통의 경우> 동적메모리 할당받는 변수 type의 크기를 입력한다.)
- 메모리를 할당할 elements(요소)의 크기
반환값
성공 시 유효한 포인터 주소를 반환한다.
실패 시 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
반응형
'C언어 > stdlib.h' 카테고리의 다른 글
[C언어] abs 함수 (정수의 절대값 구하기) (0) | 2023.03.29 |
---|---|
[C언어] realloc (heap 메모리 크기 변경) (0) | 2023.03.28 |
[C언어] free 함수 (heap 메모리 해제) (0) | 2023.03.26 |
[C언어] malloc 함수 (heap 메모리 할당) (1) | 2023.03.01 |
[C언어] abort 함수 (프로그램 중단, 비정상 종료) (0) | 2023.03.01 |