반응형

calloc(3)

#include <stdlib.h>

void *calloc(size_t nmemb, size_t size);

calloc(3)은 size byte 크기의 데이터 type을 nmemb개 저장할 수 있을 크기의 메모리를 할당합니다.

즉, size * nmemb 바이트의 메모리를 할당합니다. calloc(3)은 heap 메모리를 할당합니다. 또한 malloc(3)과는 달리 할당된 메모리를 0x00으로 초기화합니다. 만약, nmemb 또는 size가 0이면 NULL 또는 free(3)시에 오류가 나지 않도록 적절한 pointer를 return 합니다.

 

만약 메모리 할당 후에 굳이 메모리에 대한 초기화가 필요없다면, malloc(3)을 사용하고, 그렇지 않으면 calloc(3)을 사용하는 것이 좋습니다.

 

예를들면,

int *ptr = (int *)calloc(10000, sizeof(int));

int *ptr = (int *)malloc(sizeof(int) * 10000);
memset(ptr, 0x00, sizeof(int) * 10000);

은 같은 기능을 합니다.

그러나 성능면에서 단순 메모리 할당만 한다면 malloc(3)의 성능이 좋고, memory 할당 후에 초기화까지 필요하다면 calloc(3)을 사용하는 것이 좋습니다.

 

 

파라미터

nmemb
    - 다음 파라미터인 size의 갯수입니다. 
      즉, 할당할 배열의 갯수입니다.
size
    - item 하나의 크기입니다.

 

RETURN

NULL 이외
    - nmemb * size byte만큼의 heap 메모리를 할당하고, 할당된 메모리 주소를 return 합니다.
      return type이 void *이므로 pointer 변수에 대입할 때에 type casting을 하여 대입합니다.

NULL
    - 메모리할당에 실패하였습니다.

 


활용 예제

 

Sample

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

......

int main(int argc, char *argv[])
{
    int *ptr;
    int  count;

    ......

    /* memory를 할당합니다. */
    if((ptr = (int *)calloc(count, sizeof(int)) == NULL) {
        fprintf(stderr, "calloc error.\n");
        return 1;
    }

    ......

    /* memory를 해제합니다. */
    free(ptr);

    /* 
      free후에는 될 수 있으면 NULL을 대입하여 혹시라도 두 번 free하는 것을 방지하는 것이 좋습니다. 
      free한 메모리에 대해서 또 free하게 되면 coredump 비정상 종료될 수 있습니다.
    */
    ptr = NULL;

    return 0;
}

 


see also : memory 관련 함수

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,