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 세로에 가로 공간 메모리 할당

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