C언어에서 2차원 배열 동적 할당이란?
C언어에서는 단일 포인터를 사용하여 2차원 배열을 동적으로 할당할 수 있습니다. 이 방식은 malloc 함수를 통해 행 × 열 × 데이터 타입 크기만큼의 메모리 블록을 한 번에 할당하고, 포인터 산술 연산(pointer arithmetic)을 활용해 각 행렬 요소에 접근하는 방법입니다.
이 방법은 메모리가 연속적으로 할당되기 때문에 캐시 효율성이 좋고, 해제할 때도 free를 한 번만 호출하면 된다는 장점이 있습니다.
예제 코드
다음 프로그램은 2×3 크기의 2차원 배열을 동적으로 할당하고, 각 요소를 초기화한 후 출력합니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int row = 2, col = 3;
int *arr = (int *)malloc(row * col * sizeof(int));
int i, j;
// 포인터 산술 연산으로 배열 요소 초기화
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
*(arr + i*col + j) = i + j;
printf("The matrix elements are:\n");
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ", *(arr + i*col + j));
}
printf("\n");
}
free(arr); // 동적으로 할당한 메모리 해제
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
The matrix elements are: 0 1 2 1 2 3
코드 상세 설명
1. 메모리 할당 및 배열 초기화
먼저 malloc을 사용하여 2차원 배열 arr에 필요한 메모리를 동적으로 할당합니다. 그다음 중첩된 for 루프와 포인터 산술 연산을 통해 각 요소를 초기화합니다.
int row = 2, col = 3;
int *arr = (int *)malloc(row * col * sizeof(int));
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
*(arr + i*col + j) = i + j;
여기서 핵심은 인덱스 계산 공식입니다. (i * col) + j를 통해 실제 1차원 메모리상의 위치를 찾아 마치 2차원 배열처럼 접근할 수 있습니다. 예를 들어, i=1, j=2라면 1×3+2 = 5번째 요소에 접근하게 됩니다.
2. 결과 출력 및 메모리 해제
초기화가 완료되면 같은 방식으로 배열 값을 화면에 출력하고, 마지막으로 free 함수를 호출하여 동적으로 할당된 메모리를 반납합니다. 메모리 누수(memory leak)를 방지하기 위해 free 호출은 반드시 잊지 말아야 합니다.
printf("The matrix elements are:\n");
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ", *(arr + i*col + j));
}
printf("\n");
}
free(arr);
정리
단일 포인터를 활용한 2차원 배열의 동적 할당은 다음 세 단계로 구성됩니다.
① malloc으로 전체 크기만큼 메모리 할당 → ② 포인터 산술 연산(i*col+j)으로 요소 접근 및 초기화 → ③ free로 메모리 해제
이 방식은 코드가 간결하고 관리가 쉬워, 실행 시간에 배열 크기를 결정해야 하는 상황에서 널리 사용됩니다.