Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[C] 3차원 배열 같은 3차원 포인터의 동적 할당 본문

Programming/C

[C] 3차원 배열 같은 3차원 포인터의 동적 할당

scii 2020. 6. 13. 23:33

https://nomad-programmer.tistory.com/87

 

[C] 2차원 배열 같은 2차원 포인터의 동적 할당

열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메�

nomad-programmer.tistory.com

위의 2차원 포인터 동적 할당 포스터중의 예제에서 확장한 것이다.

#include <stdio.h>
#include <malloc.h>

int main(void) {
    unsigned int*** arr3d;
    unsigned int cnt3d;
    unsigned int cnt2d;
    unsigned int cnt1d;
    unsigned int temp;

    fputs("x축 개수: ", stdout);
    scanf_s("%d", &temp);

    arr3d = (int***)malloc(temp * sizeof(int**));
    cnt3d = (_msize(arr3d) / sizeof(int**));

    for (int x = 0; x < cnt3d; x++) {
        printf("\n-- %d번째 x축 --\n", x + 1);
        fputs("y축 개수: ", stdout);
        scanf_s("%d", &temp);
        *(arr3d + x) = (int**)malloc(temp * sizeof(int*));
        cnt2d = (_msize(*(arr3d + x)) / sizeof(int*));
        for (int y = 0; y < cnt2d; y++) {
            printf("\n-- %d번째 y축 --\n", y + 1);
            fputs("z축 개수: ", stdout);
            scanf_s("%d", &temp);
            *(*(arr3d + x) + y) = (int*)malloc(temp * sizeof(int));
            cnt1d = (_msize(*(*(arr3d + x) + y)) / sizeof(int));
            for (int z = 0; z < cnt1d; z++) {
                *(*(*(arr3d + x) + y) + z) = z;
            }
        }
    }

    puts("");
    for (int x = 0; x < cnt3d; x++) {
        cnt2d = _msize(*(arr3d + x)) / sizeof(int*);
        for (int y = 0; y < cnt2d; y++) {
            cnt1d = _msize(*(*(arr3d + x) + y)) / sizeof(int);
            for (int z = 0; z < cnt1d; z++) {
                printf("%d ", *(*(*(arr3d + x) + y) + z));
            }
            free(*(*(arr3d + x) + y));
            puts("");
        }
        free(*(arr3d + x));
        puts("");
    }

    free(arr3d);

    return 0;
}

// 결과
/*

x축 개수: 3

-- 1번째 x축 --
y축 개수: 4

-- 1번째 y축 --
z축 개수: 8

-- 2번째 y축 --
z축 개수: 2

-- 3번째 y축 --
z축 개수: 3

-- 4번째 y축 --
z축 개수: 5

-- 2번째 x축 --
y축 개수: 3

-- 1번째 y축 --
z축 개수: 7

-- 2번째 y축 --
z축 개수: 2

-- 3번째 y축 --
z축 개수: 3

-- 3번째 x축 --
y축 개수: 5

-- 1번째 y축 --
z축 개수: 6

-- 2번째 y축 --
z축 개수: 2

-- 3번째 y축 --
z축 개수: 7

-- 4번째 y축 --
z축 개수: 3

-- 5번째 y축 --
z축 개수: 5

0 1 2 3 4 5 6 7
0 1
0 1 2
0 1 2 3 4

0 1 2 3 4 5 6
0 1
0 1 2

0 1 2 3 4 5
0 1
0 1 2 3 4 5 6
0 1 2
0 1 2 3 4

*/

이것 또한 마찬가지로 스택영역에서 3차원 배열을 선언했다면...

(3 * 5 * 8 * 4바이트) = 총 480바이트

총 480바이트가 필요했을 것이다. 

그러나 힙 영역에서의 동적 할당을 활용하여 메모리를 데이터에 딱 맞게 할당하였다. 이로 인해 메모리를 낭비하는 일을 줄였다.

(18 * 4바이트) + (12 * 4바이트) + (23 * 4바이트) = 총 212바이트

Comments