c언어에서 2차원배열을 만드는 방법은 다음과 같다.

int arr[6][8];
그러면 가로 8, 세로 6의 2차원 배열이 생성된다. 하지만 가로의 크기와 세로의 크기를 컴파일 이전 시간에 미리 정해줘야 한다. 사용자로부터 입력받은 가로와 세로의 크기로, 혹은 실행시간 도중에 정한 크기로 2차원 배열을 만들기 위해선 다른 방법을 사용해야한다.

int height = 6, width = 8;
int arr[ height ][ width ];    // 이런식으로 배열을 만들수 없다.
malloc()로 동적으로 할당 받아야 한다.
1차원 배열을 동적으로 할당 받는 방법은 다음과 같다.

int width = 8;
int *arr;
arr = (int *) malloc ( sizeof(int) * width );
동적으로 할당받은 메모리도, 배열처럼 접근이 가능하다.
arr[0], arr[1], ... arr[7]

2차원 배열을 할당받는 방법은, malloc()를 여러번 호출하는 것이다.

int height = 6, width = 8;
int **arr;
arr = (int**) malloc ( sizeof(int*) * height );
for(int i=0; i<height; i++){
    arr[i] = (int*) malloc ( sizeof(int) * width );
}




할당받은 2차원배열을 다 사용하고 나서, 해제해줘야 한다.
for문을 이용해서 여러번 malloc()로 메모리 공간을 할당 받았기 때문에, 해제할때도, for을 이용해서 여러번 해제해야 한다.
위 그림에서 세로의 크기만큼 malloc()를 호출하고, 또 그전에 한번 malloc()를 호출했다. 따라서, (height + 1)번 해제해야 한다.

for(int i=0; i<height; i++){
    free(arr[i]);
}
free(arr);

2차원 배열 할당과 해제가 번거롭다. 조금 방법을 달리 하면, 한번에 해제할 수 있는 구조로 2차원 배열을 만들 수 있다.


int height=8,width=6;
int **arr;
arr = (int **) malloc ( sizeof(int *) * height);
arr[0] = (int *) malloc ( sizeof(int) * width*height );
for( int i=1; i<height; i++){
    arr[i] = arr[ i-1 ] + width;
}
malloc()를 딱 두번만 사용했다. 두번째 malloc()에서, 배열의 크기를 width*height 로 한번에 크게 할당받았다.
그리고 이후에 for문을 통해 연결만 해주었다.

해제하는 방법도 간단하다.

free(arr[0]);
free(arr);


Posted by Нуеоп