본문 바로가기
프로그래밍 언어/C, C++ 다양한 예시들

[C 언어] 2차원 동적 배열 만들기

by Physics 2021. 1. 31.
728x90

1차원 동적 배열을 만드는 것은 단순히 다음과 같이 malloc()함수를 이용하면 된다. 
ex) 만약 사용자로부터 임의의 정수를 받은 후, 그 수의 크기에 해당하는 배열을 만든다고 가정을 하자.

int input_n;
scanf("%d", &input_n);                             
int *array = (int *)malloc(sizeof(int) * input_n); 

(int *)malloc(sizeof(int) * input): int 형의 input_n 칸짜리 배열을 메모리에 할당 후, 해당 주소를 반환

2차원 배열을 동적으로 할당하는 경우, 아래와 같이 크게 두 가지의 이슈가 있다. 
 • 배열의 원소가 인접해야하는지
 • 배열이 가변적이어야 하는지    

 

2차원 동적 배열 만들기

※ 2차원 동적 배열 만들기 요약
  (1) 이중 포인터로 배열의 크기가 row인 포인터 배열을 생성
  (2) 생성된 포인터 배열로 다시 한번 배열의 크기가 col인 배열을 생성 

※ 2차원 동적 배열 예시 

int **d_array = (int **)malloc(sizeof(int *) * row);

for(int i; i < row; i++){ 
	array[i] = (int *) malloc(sizeof(int) * col);
    };

// 동적 배열의 사용이 끝난 후, 메모리 해제
for(int i; i < row; i++){ 
	free(array[i]);
    };
free(array); 

위 예시에 대한 설명은 아래의 그림을 통해서 확인할 수 있다. 

※ 주의사항

사용이 완료된 동적 배열의 경우 반드시 free()함수를 사용함으로써, 메모리를 해제시켜줘야한다. 만약 메모리 해제를 하지 않는다면, 메모리 누수 (Memory leak)를 일으킬 수 있다. 2차원 동적 배열을 해제하는 방법은 생성한 순서의 역으로 해주면 된다. 
(1)  free(array[i]) 
(2) free(array)

※ NOTE: 불연속 메모리 할당과 인접한 메모리 할당
위와 같은 형식으로 2차원 동적배열을 만드는 경우, 먼저 바깥쪽 배열에 메모리를 할당한 다음 별도의 malloc() 함수를 이용하여 각 행에 메모리를 할당한다. 따라서 다시 한번 별도의 malloc() 함수를 이용하여 메모리를 할당하였기 때문에, 할당된 메모리가 인접해 있다고 보장할 수 없다. 

따라서, 만일 동적 배열들이 인접한 메모리에 할당을 하기 원한다면, 아래와 같이 두 가지 방법이 있다. 

a. 첫번째 방법 
  (1) 바깥쪽 배열을 먼저 할당 
  (2) 전체 행에 대한 메모리를 할당 

int row = 2;
int column = 5;

// 1. 첫번째 단계
// - 첫 번째 malloc() 호출로 정수에 대한 포인터 배열을 할당.
// - 각 요소는 행에 대한 포인터를 가짐 
int **matrix = (int**) malloc(row * sizeof(int));

// 2. 두 번째단계 
// 배열의 모든 요소에 대한 메모리를 matrix의 첫번째 원소에 할당 
matrix[0] = (int*) malloc(row * column * sizeof(int));

// 3. 세 번째 단계 
// For 구문을 이용하여, 첫 번째 배열의 각 요소에 두 번째 malloc()에서 할당한 메모리의 일부를 지정
for (int i = 0; i < row; i ++){
	matrix[i] = matrix[0] + i * column;
}

 

b. 배열에 필요한 모든 메모리를 한번에 할당 

int *matrix = (int *) malloc(row * column * sizeof(int));

 - 이 경우의 경우, 코드 안에서 배열을 참조할 때, 배열 첨자를 사용할 수 없음 
 - 배열의 인덱스를 다음과 같이 수동으로 계산해야 함 
   ex) matrix + (i * column) + j : matrix[i][j]에 대해 대응되는 배열의 인덱스 

 

Reference:
[1] m.blog.naver.com/PostView.nhn?blogId=jsky10503&logNo=221261265884&proxyReferer=https:%2F%2Fwww.google.com%2F
[2] luyin.tistory.com/176
[3] luna-archive.tistory.com/3
[4] codeng.tistory.com/8
    

 

 

 

728x90

댓글