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]); }
해설
포인터를 배열처럼 사용하는 것이 이해하기 어렵다면 다음 그림을 코드로 작성해봅시다.
포인터에 메모리를 할당하여 3차원 배열로 사용하는 방법도 2차원 배열의 경우와 원리는 같습니다. 먼저 삼중 포인터를 선언한 뒤 면의 포인터가 들어갈 공간을 할당합니다. 여기서는 높이가 2이므로 면이 2개 들어갑니다.
long long ***numPtr = malloc(sizeof(long long **) * 2);
이제 면의 개수(depth)만큼 반복하면서 세로 공간에 해당하는 메모리를 할당합니다.
for (int depth = 0; depth < 2; depth++) { numPtr[depth] = malloc(sizeof(long long *) * 3);
면 반복문 안에서 다시 세로 크기(row)만큼 반복하면서 가로 공간에 해당하는 메모리를 할당해주면 됩니다.
for (int row = 0; row < 3; row++) { numPtr[depth][row] = malloc(sizeof(long long) * 5); }
메모리를 해제할 때는 메모리 할당과 반대 순서로 해주면 됩니다. 즉, 메모리를 할당할 때 면 → 세로 → 가로 순서로 할당했으므로 해제할 때는 반대로 가로 → 세로 → 면 순서입니다.