반응형

malloc(3)

#include <stdlib.h>

void *malloc(size_t size);

malloc(3)함수는 size byte 만큼의 메모리를 Heap 영역에 할당하고 그 할당된 메모리의 pointer를 return 합니다. 할당된 메모리는 초기화되지 않습니다. malloc(3)함수는 heap memory영역을 할당합니다. 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)이 calloc(3)보다 좋지만, 초기화까지 해야 한다면, calloc(3)이 더 성능면에서 좋습니다.

 

C99를 지원하는 compiler에서는 특정 함수 내에서만 동적 메모리 할당이 필요한 경우에는 

int size;

/* 필요 크기 계산하여 size에 넣기 */
size = strlen(buf) + 1024;

char ptr[size];

형식을 지원합니다. 즉, stack 메모리 영역에 대한 동적 할당을 지원합니다. 자동으로 함수가 종료시 메모리가 해제됩니다.  물론 그 변수에 재할당은 안됩니다. stack 메모리의 할당은 빠른 할당과 해제가 이루어지므로 검토할 필요가 있습니다.

 

 

파라미터

size
    - 메모리를 할당할 byte수

 

RETURN

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

NULL 아닌 경우
    - 메모리가 할당된 heap영역의 메모리 주소.
      malloc(3)함수의 return type이 void *이므로 pointer 변수에 대입할 때에 
      type casting을 하여 대입합니다.

 

 


활용 예제

 

 

Sample

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

......

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

    ......

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

    ......

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

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

    return 0;
}

 


see also : memory 관련 함수

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,