개발/C와 C++

[C/C++] 메모리 할당(malloc, calloc, realoc, free)

어중E 2022. 8. 22. 11:45

[C/C++] 메모리 할당(malloc, calloc, realoc, free)

C언어에서는 메모리를 할당할 때가 있습니다. 그때 사용하는 함수들입니다. allocation이 할당이라는 뜻을 가지고 있기에 함수의 이름으로 의미를 파악할 수 있습니다. <stdlib.h> 헤더파일에 있으며 다음과 같습니다.

  • malloc (memory allocation - 메모리 할당) : 메모리를 할당한다.
  • calloc (contiguous allocation - 연속 할당) : 메모리를 할당 및 초기화한다.
  • realloc (resize allocation - 할당 크기 조절) : 메모리를 추가 할당한다.
  • free : 메모리를 할당을 해제한다.

각각의 함수와 예시를 살펴보면 다음과 같습니다.

 

 

void *malloc(size_t size);

매개변수로 메모리의 크기를 전달받으며, 이 크기만큼 메모리가 할당된다. 보통 배열과 관련된 변수를 동적으로 할당할 때 쓰인다. 배열의 크기를 변수로 정할 수 없다. 따라서 프로그램 실행 중에 배열의 크기가 결정되는 경우에는 동적으로 메모리를 할당한다. 개발자가 어떤 자료 형태로 메모리를 할당할지 모르기 때문에 void *으로 정해졌고, 이는 개발자가 (int *)와 같은 형태로 사용할 자료형을 정해주면 된다.

int *numAllocArr = (int *)malloc(sizeof(int) * n);

 

 

void *calloc(size_t nelem, sizeo_t elsize);

calloc 함수는 배열 요소의 개수와 배열 요소의 사이즈를 매개변수로 받고 있다. 다만 malloc 과의 차이점은 모두 0으로 초기화 시킨다는 것이다.

int *numAllocArr = (int *)calloc(n,sizeof(int));

 

 

void *realloc(void *ptr, size_t size);

realloc은 원래 할당된 메모리의 크기를 변경할 때 사용한다. 첫 번째 매개변수에는 변수 이름을 넣고, 두 번째는 변경할 크기를 넣어준다.

int *numAllocArr = (int *)malloc(sizeof(int) * n);
realloc(numAllocArr, sizeof(int) * 2 * n);

 

 

void free(void* ptr);

할당된 메모리를 매개변수로 넣고 사용하면, 메모리가 해제됩니다. 할당을 하고 해제하지 않으면, 메모리 누수(메모리 낭비)가 있을 수 있으니, 놓치지 않도록 합니다.

int *numAllocArr = (int *)malloc(sizeof(int) * n);
free(numAllocArr);