본문 바로가기
2학년 2학기/c언어

13-12장 다차원 배열의 동적 할당 ⭐⭐⭐

by kkkkk1023 2024. 11. 26.

동적 할당을 통해서 다중 배열을 만들 수 있다.

 

첫 번째로 배열 동적 할당을 하고, 동적 할당을 배열 요소에 다음 동적 할당을 받는다. 그림으로 표현하면 다음과 같다. 

 

 

 

[2차원]

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

void fillArr(int **arr, int row, int col) {
        int i, j;
        for(i = 0; i < row; i++) {
                for(j = 0; j < col; j++) arr[i][j] = i*col + j;
        }
}

int main() {
    int ** arr;
    int i, j, row = 3, col = 2;

    // 행 생성하기
    arr = (int **)malloc(row * sizeof(int *));
    if(!arr) {
        printf("error malloc1\n"); return 0;
    }
    
    // 열 생성하기
	for(i = 0; i < row; i++) {
        arr[i] = (int *)malloc(col * sizeof(int));
	    if(!arr[i]) {
	         printf("error malloc2\n"); return 0;
        }
    }
    
    // 배열에 값 넣기
    fillArr(arr, row, col);

    // 베열 출력하기
    for(i = 0; i < row; i++) {
        for(j = 0; j < col; j++) printf("%d ", arr[i][j]);
        printf("\n");
    }
    // 동적 할당 해제하기 (열부터 진행)
    for(i = 0; i < row; i++) {
        free(arr[i]);
    }
    
    // 동적 할당 해제하기 (행 진행)
    free(arr);

    return 0;
}

 

 

[3차원]

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

// 3차원 배열에 값 채우는 함수
void fill3DArray(int ***arr, int depth, int row, int col) {
    int i, j, k;
    for (i = 0; i < depth; i++) {
        for (j = 0; j < row; j++) {
            for (k = 0; k < col; k++) {
                arr[i][j][k] = i * row * col + j * col + k;
            }
        }
    }
}

int main() {
    int ***arr;
    int i, j, k;
    int depth = 3, row = 2, col = 5;

    // 깊이 할당 (Depth 생성)
    arr = (int ***)malloc(depth * sizeof(int **));
    if (!arr) {
        printf("Error allocating depth\n");
        return 0;
    }

    // 행 할당 (Row 생성)
    for (i = 0; i < depth; i++) {
        arr[i] = (int **)malloc(row * sizeof(int *));
        if (!arr[i]) {
            printf("Error allocating row\n");
            return 0;
        }
    }

    // 열 할당 (Column 생성)
    for (i = 0; i < depth; i++) {
        for (j = 0; j < row; j++) {
            arr[i][j] = (int *)malloc(col * sizeof(int));
            if (!arr[i][j]) {
                printf("Error allocating column\n");
                return 0;
            }
        }
    }

    // 배열에 값 채우기
    fill3DArray(arr, depth, row, col);

    // 배열 출력하기
    for (i = 0; i < depth; i++) {
        printf("Depth %d:\n", i);
        for (j = 0; j < row; j++) {
            for (k = 0; k < col; k++) {
                printf("%d ", arr[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }

    // 메모리 해제 (Column부터 해제)
    for (i = 0; i < depth; i++) {
        for (j = 0; j < row; j++) {
            free(arr[i][j]);
        }
        free(arr[i]);
    }
    free(arr);

    return 0;
}

 

[출력]

Depth 0:
0 1 2 3 4 
5 6 7 8 9 

Depth 1:
10 11 12 13 14 
15 16 17 18 19 

Depth 2:
20 21 22 23 24 
25 26 27 28 29