Post List

2015년 1월 4일 일요일

[C/C++] 2차원 배열 동적 할당

때때로 2차원 배열을 동적으로 할당하여 써야 할 때가 많습니다

막 C/C++ 언어를 배웠을 무렵에는 아무런 의심없이 당연한 듯이 더블 포인터를 이용했지요

아마 다들 한번씩은 다음과 같이 써보셨을 거라고 생각합니다

int** pData = new int* [ ROW ];

for( int i=0; i < ROW; i++ )
{
        pData[i] = new int [ COLUMN ];
}

이 방법에는 여러 단점이 존재하게 됩니다

먼저, 할당을 여러번 사용해야 한다는 점이 있지요

행(Row)의 수 + 1만큼의 new 또는 malloc을 사용해서 공간을 할당받아야 하지요

또한 저렇게 할당 될 경우, 아래 그림처럼 데이터들이 열마다 서로 다른 공간에 할당되어 있기 때문에

전체 초기화도 행마다 memset을 해줘야 하는 번거로움이 있기 마련입니다

 
그러다가 1차원 배열로 할당해서 사용하게 되었지요

아무래도 이쪽이 이득이 많다고 생각해서 인 것 같습니다

하지만 1차원 배열은 index를 계산해야 하는 번거로움이 있다고 느끼실지도 모릅니다

바로 이런식으로 말이지요

pData[ r * COLUMN + c ] = data[r][c];



그래서 요즘은 이렇게 쓰기도 합니다

메모리를 일부 희생시킴으로 해서 접근성을 높여본 것이지요

int *pData;
int **pDouble;

pData     = new int [ ROW * COLUMN ];
pDouble  = new int* [ ROW ];

forint i=0; i < ROW; i++ )
{
        pDouble[i] = &( pData[ i * COLUMN ] );
}

위의 2 방법을 절충(?)시킨 방법입니다만... 그럭저럭 쓸만합니다

뭐 이런게 팁이라고 할만한 내용은 아닙니다만...

일단, 할당이 한번 더 늘어난다는 점이 있지만,

필요에 의해서 초기화 / 복사 등을 이용할 때에는 pData 포인터를 사용하시고

row, column으로 데이터에 접근하실 때는, pDouble 포인터를 이용하면 됩니다



어떻게 보면 전혀 쓸모없는 (오히려 안좋은) 방법일 수도 있지만...

사용하기에 따라서는 한번씩은 써볼만한 것 같습니다 

댓글 없음:

댓글 쓰기