38.6 연습문제: 포인터에 할당된 메모리를 3차원 배열처럼 사용하기

다음 소스 코드를 완성하여 포인터에 할당된 메모리를 높이 2, 세로 크기 3, 가로 크기 5인 3차원 배열처럼 사용할 수 있도록 만드세요.

practice_pointer_like_three_dimensional_array.c

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

int main()
{
    long long ***m = malloc(sizeof(long long **) * 2);

    ①_____________________________________________________
    ...                                                   
    ______________________________________________________

    m[1][2][4] = 100;

    printf("%lld\n", m[1][2][4]);

    ②_____________________________________________________
    ...                                                   
    ______________________________________________________

    free(m);

    return 0;
}

실행 결과

100

정답

①
for (int depth = 0; depth < 2; depth++)
{
    m[depth] = malloc(sizeof(long long *) * 3);

    for (int row = 0; row < 3; row++)
    {
        m[depth][row] = malloc(sizeof(long long) * 5);
    }
}

②
for (int depth = 0; depth < 2; depth++)
{
    for (int row = 0; row < 3; row++)
    {
        free(m[depth][row]);
    }

    free(m[depth]);
}

해설

포인터를 배열처럼 사용하는 것이 이해하기 어렵다면 다음 그림을 코드로 작성해봅시다.

▼ 그림 38‑4 삼중 포인터를 3차원 배열처럼 사용하기
 

포인터에 메모리를 할당하여 3차원 배열로 사용하는 방법도 2차원 배열의 경우와 원리는 같습니다. 먼저 삼중 포인터를 선언한 뒤 면의 포인터가 들어갈 공간을 할당합니다. 여기서는 높이가 2이므로 면이 2개 들어갑니다.

long long ***numPtr = malloc(sizeof(long long **) * 2);
▼ 그림 38‑5 삼중 포인터에 면 공간 메모리 할당

이제 면의 개수(depth)만큼 반복하면서 세로 공간에 해당하는 메모리를 할당합니다.

for (int depth = 0; depth < 2; depth++)
{
    numPtr[depth] = malloc(sizeof(long long *) * 3);
▼ 그림 38‑6 면에 세로 공간 메모리 할당

면 반복문 안에서 다시 세로 크기(row)만큼 반복하면서 가로 공간에 해당하는 메모리를 할당해주면 됩니다.

for (int row = 0; row < 3; row++)
{
    numPtr[depth][row] = malloc(sizeof(long long) * 5);
}
▼ 그림 38‑7 세로에 가로 공간 메모리 할당

메모리를 해제할 때는 메모리 할당과 반대 순서로 해주면 됩니다. 즉, 메모리를 할당할 때 면 → 세로 → 가로 순서로 할당했으므로 해제할 때는 반대로 가로 → 세로 → 면 순서입니다.