Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
05-16 01:30
관리 메뉴

nomad-programmer

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

Programming/C

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

scii 2020. 6. 13. 20:34

열의 개수가 행 별로 각기 다르다면 2차원 배열로 생성할 시 메모리 낭비가 불가피하다. 

허나, 2차원 포인터로 동적 할당하여 2차원적으로 구조를 생성하면 메모리를 낭비하지 않는 타이트한 메모리 구조를 생성할 수 있다.

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

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

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

    arr2d = (int**)malloc(temp * sizeof(int*));
    //cnt2d = temp; 아래의 연산과 같음. heap영역에 동적 할당하여 _msize함수 사용
    cnt2d = (_msize(arr2d) / sizeof(int*));

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

    puts("");
    for (int i = 0; i < cnt2d; i++) {
        cnt1d = (_msize(*(arr2d + i)) / sizeof(int));
        for (int j = 0; j < cnt1d; j++) {
            printf("%d ", *(*(arr2d + i) + j));
        }
        free(*(arr2d + i));
        puts("");
    }

    free(arr2d);

    return 0;
}

// 결과
/*

x축 개수: 9

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

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

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

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

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

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

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

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

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

0 1 2 3 4
0 1 2 3
0 1 2
0 1
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4

*/

위의 예제를 stack영역의 2차원 배열로 생성했다면 총 180바이트 (9 * 5 * 4바이트)가 필요하다.

하지만 heap영역에 동적 할당하여 위와 같은 2차원적인 배열 구조를 생성한다면 총 116바이트 ((15 * 2 -1) * 4바이트) 만 있으면 된다. 

Comments