상세 컨텐츠

본문 제목

[C] 2차원 배열 동적할당

C

by Wanderer Kim 2019. 7. 16. 21:48

본문

728x90

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

 

<syntax>

var_type *pointer_name = malloc(sizeof(var_type) * length);

 

1차원 배열 동적할당 예제
실행 결과

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

 

 

2차원 배열 동적할당

 

다음으로 2차원 배열을 동적할당하는 방법을 다음 예제를 통해서 알아보자.

 

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)를 일으켜 프로그램이 에러를 일으킬 수 있다. 해제하는 방법을 아래와 같다.

 

2차원 동적할당 해제 예제

해제 순서는 할당과 반대로 먼저 가로 공간를 해제한 다음 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' 카테고리의 다른 글

[C] 임베디드 시스템에서 volatile 키워드를 사용하는 이유  (2) 2019.07.16

관련글 더보기

댓글 영역