`malloc` — 메모리를 할당하는 함수

malloc — 메모리를 할당하는 함수

프로그램을 짜다 보면 실행 중에 크기를 정해야 하는 데이터가 있어요. 예를 들어 정수 4개짜리 배열이면 좋겠다, 라고 하는 경우 보통 malloc이 첫 번째로 등장하죠. 미리 초기화 없이 원하는 크기만큼 메모리를 잡아 주는 함수입니다.

출처: cppreference — malloc

본문

malloc은 초기화되지 않은 저장소를 size 바이트만큼 할당해요.

문법

#include <stdlib.h>

void *malloc( size_t size );

설명

할당에 성공하면, 기본 정렬(fundamental alignment)을 가진 어떤 객체 타입에도 맞게 정렬된 포인터를 돌려줘요. size가 0이면 동작은 구현에 정의됩니다. 예를 들어 널 포인터가 돌아올 수도 있고, 널이 아닌 포인터가 돌아올 수도 있는데 — 이 경우 그 포인터는 역참조하면 안 되고, 메모리 누수를 막으려면 free에 넘겨야 합니다.

malloc은 스레드 안전(thread-safe)해요. 인자를 통해 보이는 메모리 위치만 접근하는 것처럼 동작하죠. 한 영역의 메모리를 해제하는 이전의 free, free_sized, free_aligned_sized(C23부터), 또는 realloc 호출은, 같은 영역이나 그 일부를 할당하는 malloc 호출과 동기화됩니다.

매개변수

매개변수 설명
size 할당할 바이트 수

반환값

성공하면 새로 할당된 메모리의 시작을 가리키는 포인터를 돌려줘요. 메모리 누수를 막으려면 이 포인터를 free()realloc()로 해제해야 합니다. 실패하면 널 포인터를 돌려줍니다.

예시

같은 크기의 배열을 할당하는데 표현만 다른 세 가지 방법을 보여 주는 예시예요.

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

int main(void)
{
    int *p1 = malloc(4 * sizeof(int)); // allocates enough for an array of 4 int
    int *p2 = malloc(sizeof(int[4]));   // same, naming the type directly
    int *p3 = malloc(4 * sizeof *p3);   // same, without repeating the type name

    if (p1)
    {
        for (int n = 0; n < 4; ++n) // populate the array
            p1[n] = n * n;

        for (int n = 0; n < 4; ++n) // print it back out
            printf("p1[%d] == %d\n", n, p1[n]);
    }

    free(p1);
    free(p2);
    free(p3);
}

출력:

p1[0] == 0
p1[1] == 1
p1[2] == 4
p1[3] == 9

4 * sizeof(int), sizeof(int[4]), 4 * sizeof *p3 — 세 방식 모두 4개 int를 담을 크기를 할당해요. 세 번째 방식은 타입 이름 없이 이미 선언된 포인터를 이용하는 관용구라 많은 코드에서 볼 수 있습니다. 할당한 포인터는 전부 free로 해제해 준 점도 확인하세요.

더 알아보기

  • calloc — 0으로 초기화된 메모리를 할당해요.
  • realloc — 메모리 영역을 재할당해요.
  • free — 이전에 할당한 메모리를 해제해요.
  • cppreference의 malloc 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.