티스토리 뷰
때때로 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 ];
for( int i=0; i < ROW; i++ )
{
pDouble[i] = &( pData[ i * COLUMN ] );
}
위의 2 방법을 절충(?)시킨 방법입니다만... 그럭저럭 쓸만합니다
뭐 이런게 팁이라고 할만한 내용은 아닙니다만...
일단, 할당이 한번 더 늘어난다는 점이 있지만,
필요에 의해서 초기화 / 복사 등을 이용할 때에는 pData 포인터를 사용하시고
row, column으로 데이터에 접근하실 때는, pDouble 포인터를 이용하면 됩니다
new
를 2번 해줬기 때문에 해제 할 때도 2번만 하시면 됩니다
delete[] pData;
delete[] pDouble;
어떻게 보면 전혀 쓸모없는 (오히려 안좋은) 방법일 수도 있지만...
사용하기에 따라서는 한번씩은 써볼만한 것 같습니다
아래는 C 버전 함수로 만들 경우...
void** malloc_2d(size_t type_size, size_t row_count, size_t col_count)
{
typedef char byte;
size_t row_increment = type_size * col_count;
byte **pRet = (byte **)malloc(sizeof(void *) * row_count);
byte *pData = malloc(row_increment * row_count);
if(pRet == NULL || pData == NULL) {
free(pRet);
free(pData);
return NULL;
}
for(size_t i = 0 ; i < row_count; i++, pData += row_increment) {
pRet[i] = pData;
}
return (void **)pRet;
}
void free_2d(void **pp)
{
free(pp[0]);
free(pp);
}
아래는 사용 방법
int **imat = (int **)malloc_2d(sizeof(int), 3, 2);
memset( imat[0], 0x00, sizeof(int) * 3 * 2);
for(int r = 0; r < 3; r++) {
for(int c = 0; c < 2; c++) {
printf("%02d ", imat[r][c]);
}
printf("\n");
}
free_2d((void **)imat);
'개발 관련 정리 (구 블로그에서 백업) > Language 관련' 카테고리의 다른 글
[C/C++] 한글 초성 추출 (0) | 2018.11.26 |
---|---|
[C/C++] MACRO함수 사용시 일어날 수 있는 문제들 (0) | 2018.11.26 |
[C/C++/JAVA] 숫자를 고려한 파일 이름 정렬 (0) | 2018.11.26 |
[C++] Date Class (0) | 2018.11.26 |
[C/C++] 어쩌다 저지를 수 있는 for문 스코프 런타임 오류 (0) | 2018.11.26 |