안녕하세요. 리습입니다.
오늘은 이차원 배열(2차원 배열)의 동적 할당에 대하여 알아보도록 하겠습니다. 이 차원 배열은 기본적으론 일반적인 동적 할당의 사용방법과 동일합니다. 다만, 2차원 배열을 수행해야 되기 때문에 이중 포인터를 사용해야 한다는 점이 다른 점입니다. 만약 이중 포인터에 대해서 기억이 잘 나지 않으신다면 다음 링크를 참고 바랍니다.
이중 포인터란? : programfrall.tistory.com/62
우선 이차원 배열을 동적할당하기 위해선 포인터의 배열을 동적 할당받아야 합니다. 그런데 여기서 우리는 포인터의 배열을 제어해야 하기 때문에 포인터의 포인터인 이중 포인터를 사용하는 것이 편리합니다. 일반적인 포인터로도 이차원 배열을 구현할 수 있으나, 이후 제어가 불편하기 때문이죠.
그리고 이렇게 동적할당 된 포인터의 배열에 각각 동적 할당을 하게 되면 바로 이차원 배열을 사용할 수 있게 되는 것입니다. 제가 글로 설명드린 부분을 그림으로 표현하면 다음과 같이 나타낼 수 있습니다.
(NULL 값의 경우 예시를 위해 넣어두었습니다. malloc사용시 NULL로 초기화되지 않습니다.)
위 그림을 통해 동적할당 순서도 다시 생각해보죠. (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축으로 표현되어 있는 영상 데이터 등에서 많이 활용되기 때문에 잘 이해하시고 편리하게 사용하시기 바랍니다.
'소프트웨어 > C 언어' 카테고리의 다른 글
[C언어]37. C언어 할당된 동적할당 크기 바꾸는법! 재 할당 : realloc (0) | 2021.03.17 |
---|---|
[C언어]36.C 동적할당 malloc 말고 초기화와 함께 하는법 : calloc (0) | 2021.03.16 |
[C언어]35.포인터의 첫번째 응용 동적할당 -2- (동적할당 하는 법, malloc, free) (0) | 2021.03.14 |
[C언어]34.포인터의 첫번째 응용 동적할당 -1- (동적할당이란) (2) | 2018.10.15 |