소프트웨어/C 언어

[C언어] 38. 이차원 배열의 동적 할당 (2차원 배열의 동적 할당)

리습 2021. 4. 8. 07:00

안녕하세요. 리습입니다.

오늘은 이차원 배열(2차원 배열)의 동적 할당에 대하여 알아보도록 하겠습니다. 이 차원 배열은 기본적으론 일반적인 동적 할당의 사용방법과 동일합니다. 다만, 2차원 배열을 수행해야 되기 때문에 이중 포인터를 사용해야 한다는 점이 다른 점입니다. 만약 이중 포인터에 대해서 기억이 잘 나지 않으신다면 다음 링크를 참고 바랍니다.

이중 포인터란? : programfrall.tistory.com/62

우선 이차원 배열을 동적할당하기 위해선 포인터의 배열을 동적 할당받아야 합니다. 그런데 여기서 우리는 포인터의 배열을 제어해야 하기 때문에 포인터의 포인터인 이중 포인터를 사용하는 것이 편리합니다. 일반적인 포인터로도 이차원 배열을 구현할 수 있으나, 이후 제어가 불편하기 때문이죠.

 그리고 이렇게 동적할당 된 포인터의 배열에 각각 동적 할당을 하게 되면 바로 이차원 배열을 사용할 수 있게 되는 것입니다. 제가 글로 설명드린 부분을 그림으로 표현하면 다음과 같이 나타낼 수 있습니다.

(NULL 값의 경우 예시를 위해 넣어두었습니다. malloc사용시 NULL로 초기화되지 않습니다.)

0
이차원 배열의 동적할당 예시

 

 위 그림을 통해 동적할당 순서도 다시 생각해보죠. (1) 이중 포인터에 포인터 배열을 선언하고, (2) 선언된 포인터 배열에 변수 배열을 선언하는 순서로 이차원 배열을 구현하게 됩니다. 이 순서는 꼭 기억해 주셔야 합니다. 왜냐하면 동적 할당의 해제는 할당받은 순서의 역순이기 때문이죠. 할당된 메모리 공간을 이용한 작업을 마무리 해준 뒤에는 꼭 할당의 해제를 해주어야 하는데, 이때는 위 순서의 반대로 해제를 해주면 됩니다. 

자 그럼 이차원 배열의 예시 코드를 통해 이차원 배열의 동적할당을 이해해 보도록 하겠습니다.

이차원 배열 동적 할당 예시 코드

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

int main(void) {
	
	int **arr = NULL;
	arr = (int**)malloc(sizeof(int*) * 10);
	for (int i = 0; i < 10; i++) {
		arr[i] = (int*)malloc(sizeof(int) * 5);
	}
	
	// example
	for (int y = 0; y < 10; y++) {
		for (int x = 0; x < 5; x++) {
			*(*(arr+y)+x) = y * 10 + x; 	// arr[y][x] = y* 10 + x;
		}
	}
	for (int y = 0; y < 10; y++) {
		for (int x = 0; x < 5; x++) {
			printf("%-6d ", arr[y][x]);
		}
		printf("\n");
	}

	// end
	for (int i = 0; i < 10; i++) {
		free(arr[i]);
	}
	free(arr);
    return 0;
}

 위 코드는 arr[10][5]를 동적 할당을 통해 할당받아, 값을 저장하고 출력해주는 코드입니다. 위 코드에서는 맨 먼저 arr이라는 이중 포인터를 선언한 다음 이 변수에 malloc을 통해 새로운 메모리 공간 10개를 할당받습니다. 이후 생성된 10개의 포인터 변수들 각각에 5개씩 int 배열을 선언하여 2차원 배열을 만들게 되는 것 이죠. 

	int **arr = NULL;
	arr = (int**)malloc(sizeof(int*) * 10);
	for (int i = 0; i < 10; i++) {
		arr[i] = (int*)malloc(sizeof(int) * 5);
	}

이렇게 만든 이차원 배열은 일반적인 이차원 배열과 동일하게 arr[][]형식 혹은 pointer의 연산 방식으로 데이터를 입력, 출력하여 사용할 수 있습니다. 자 모든 작업이 끝난 뒤에는 이차원 배열을 위해 할당된 메모리 공간을 다시 OS에 반납해야 합니다. 이를 위한 해제는 할당의 역순으로 free() 함수를 통해 수행해 주시면 됩니다.

위 코드의 실행 결과는 다음과 같습니다.

예시 코드의 실행 결과

마무리

위에 사용한 방법을 확장하게 되면, 삼차원 배열 사차원 배열, ..., N차원 배열까지 무제한 적으로 만들 수 있습니다. 특히 이차원 배열의 동적 할당의 경우 x, y축으로 표현되어 있는 영상 데이터 등에서 많이 활용되기 때문에 잘 이해하시고 편리하게 사용하시기 바랍니다.