티스토리 뷰

때때로 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);


댓글
최근에 올라온 글
Total
Today
Yesterday
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31