Namespaces
Variants

calloc

From cppreference.net
헤더 파일에 정의됨 <stdlib.h>
void * calloc ( size_t num, size_t size ) ;

num 개의 size 크기 객체 배열을 위한 메모리를 할당하고 할당된 저장 공간의 모든 바이트를 0으로 초기화합니다.

할당이 성공하면, 기본 정렬 을 가진 모든 객체 타입에 적합하게 정렬된 할당된 메모리 블록에서 가장 낮은(첫 번째) 바이트를 가리키는 포인터를 반환합니다.

만약 size 가 0이면, 동작은 구현에 따라 정의됩니다 (널 포인터가 반환될 수도 있고, 저장 공간에 접근하는 데 사용할 수 없는 일부 널이 아닌 포인터가 반환될 수도 있습니다).

calloc 는 스레드 안전합니다: 이 함수는 인자를 통해 접근 가능한 메모리 위치만 접근하는 것처럼 동작하며, 정적 저장소는 접근하지 않습니다.

메모리 영역을 해제하는 free , free_sized , 그리고 free_aligned_sized (C23부터) 또는 realloc 의 이전 호출은 동일한 메모리 영역 전체 또는 일부를 할당하는 calloc 호출과 동기화됩니다(synchronizes-with) . 이 동기화는 해제 함수에 의한 메모리 접근 이후에 발생하며, calloc 에 의한 메모리 접근 이전에 발생합니다. 각 특정 메모리 영역을操作하는 모든 할당 및 해제 함수에는 단일 전체 순서가 존재합니다.

(C11부터)

목차

매개변수

num - 객체 개수
size - 각 객체의 크기

반환값

성공 시, 새로 할당된 메모리의 시작 포인터를 반환합니다. 메모리 누수를 방지하기 위해 반환된 포인터는 free() 또는 realloc() 로 해제해야 합니다.

실패 시, 널 포인터를 반환합니다.

참고 사항

정렬 요구 사항으로 인해, 할당된 바이트 수는 반드시 num * size 와 같지 않을 수 있습니다.

모든 비트를 0으로 초기화하는 것이 부동 소수점이나 포인터가 각각 0.0 과 널 포인터 값으로 초기화됨을 보장하지는 않습니다 (비록 모든 일반적인 플랫폼에서 이것이 사실이지만).

원래(C89에서), 다음과 같은 코드를 수용하기 위해 제로 크기 지원이 추가되었습니다.

OBJ* p = calloc(0, sizeof(OBJ)); // "길이 0" 플레이스홀더
...
while(1)
{
    p = realloc(p, c * sizeof(OBJ)); // 크기가 안정될 때까지 재할당
    ... // c를 변경하거나 루프를 탈출할 수 있는 코드
}

예제

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int* p1 = calloc(4, sizeof(int));    // 4개의 int 배열을 할당하고 0으로 초기화
    int* p2 = calloc(1, sizeof(int[4])); // 동일하게, 배열 타입을 직접 명시
    int* p3 = calloc(4, sizeof *p3);     // 동일하게, 타입 이름을 반복하지 않음
    if (p2)
    {
        for (int n = 0; n < 4; ++n) // 배열 출력
            printf("p2[%d] == %d\n", n, p2[n]);
    }
    free(p1);
    free(p2);
    free(p3);
}

출력:

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.22.3.2 calloc 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.22.3.2 calloc 함수 (p: 253)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.22.3.2 calloc 함수 (p: 348)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.20.3.1 calloc 함수 (p: 313)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.10.3.1 calloc 함수

참고 항목

C++ 문서 for calloc