일차원 배열과 마찬가지로 이차원 배열 또한 동적할당을 할 수 있습니다. 이 경우 사용자가 필요한 만큼의 크기의 메모리를 할당받아 사용하므로 불필요한 자원 낭비를 최소화할 수 있다. 2차원 배열을 어떻게 동적으로 할당 받는지 알아보기 전에 복습 차원에서 일차원 배열을 동적할당하는 방법을 살펴보자.
<syntax>
var_type *pointer_name = malloc(sizeof(var_type) * length);


int *numPtr = malloc(sizeof(int) * 10); 과 같이 int 크기에 10을 곱하여 동적으로 메모리를 할당하여 1차원 배열처럼 사용할 수 있다. 즉 []연산자를 이용하여 특정 인덱스에 접근할 수 있다.
2차원 배열 동적할당
다음으로 2차원 배열을 동적할당하는 방법을 다음 예제를 통해서 알아보자.

위의 예제가 어떻게 동작하는지를 다음 그림을 보면서 설명 하겠다.

위 그림에서 볼 수 있다시피 int **arr = (int**)malloc(sizeof(int*) * height); 을 통해 2차원 배열에서 세로 공간에 해당하는 6개의 메모리를 할당한다. 그런다음 세로 크기만큼 2차원 배열의 가로 공간에 해당하는 메모리응 할당한다.
위의 예제에서는 for(int i=0; i<width; i++) 구문에서 이를 수행하고 각각의 세로 공간에 8개의 메모리를 할당하는 것을 확인할 수 있다.
이 후에는 2차원 배열의 각각의 값을 참조하는 방법과 같이 arr[i][j]을 이용하여 값을 할당 또는 가져올 수 있다.
2차원 배열 동적할당 해제
동적할당 된 메모리를 다 사용했다면 반드시 메모리를 해제해야 한다. 해제를 안한다면 메모리 누수(memory leak)를 일으켜 프로그램이 에러를 일으킬 수 있다. 해제하는 방법을 아래와 같다.

해제 순서는 할당과 반대로 먼저 가로 공간를 해제한 다음 free(arr); 처럼 세로 공간에 해당하는 메모리를 해제한다.
아래에 2차원 동적할당을 사용하는 전체 예제 코드를 첨부한다.
| 
 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 
32 
33 
34 
35 
36 
37 
38 
39 
40 
 | 
 #include<stdio.h> 
#include<stdlib.h> 
int main(void) 
{ 
    int height =6, width =8; 
    int **arr; 
    int i,j; 
    arr=(int**)malloc(sizeof(int*)*height); 
    for(i=0; i<height; i++) 
    { 
        arr[i] = (int*)malloc(sizeof(int)*width); 
    } 
    for(i=0; i<height; i++) 
    { 
        for(j=0; j<width; j++) 
        { 
            arr[i][j] = i+j+1; 
        } 
    } 
    for(i=0; i<height; i++) 
    { 
        for(j=0; j<width; j++) 
        { 
            printf("%3d", arr[i][j]); 
        } 
        printf("\n"); 
    } 
    for(i=0; i<height; i++) 
    { 
        free(arr[i]); 
    } 
    free(arr); 
    return 0; 
} 
 | 
cs | 

정리
지금까지 2차원 배열의 동적할당을 어떻게 할 수 있고 또 이를 어떻게 활용하는지 알아봤다. 동적할당은 자원 활용을 효율적으로 활용할 수 있게 해주지만, C/C++ 언어에서는 프로그래머가 반드시 동적 할당된 메모리를 사용후 해제해주는 작업을 해줘야하는 번거로움이 있다. 하지만 이 기능을 통해 C/C++언어는 시스템 자원이 한정적인 환경에서 메모리 관리를 효율적으로해서 강력한 기능을 발휘한다. 그러므로 항상 동적할당을 하면 꼭 free(); 함수를 이용해 메모리 해제를 해야한다는 점을 명심하자.
| [C] 임베디드 시스템에서 volatile 키워드를 사용하는 이유 (3) | 2019.07.16 | 
|---|
댓글 영역