이번에 3차원 배열을 이용 할 필요가 있어서 전역으로 정적선언을 해두고 잘 사용하다가 배열크기가 커지니까 컴파일러가 "warning LNK4084: total image size 991760384 exceeds max (268435456)" 라는 경고를 했다. 이 경고는 xp에선 무시해도 된다는 글을 본적이 있어서 그냥 무시하려 했지만 왠지 껄끄름 해서... 동적으로 메모리 할당해야겠다는 생각을 하게 되었다. 경고메시지에 나오는 size 숫자는 사람들마다 다른 것 같다.
어쨋거나 실전이 중요하다. 이론적으로만 3차원 배열이 뭐고 동적할당은 어떻게 한다는 걸 아는건 소용없다. 실제로 해봐야 한다. 실전으로 통해서 깨달은 건 동적으로 메모리를 할당한 후에 각 원소들을 초기화 시켜줘야 한다는거... ^^;
그나저나 전역으로 선언 안했음 더 좋았을 것을.. 어쩔 수 없는건가.. -_-;

#define EXCEL_ROW 30100
#define EXCEL_LINE 32
#define CELL_DATASIZE 128

char*** dataCube;

int main(int argc, char* argv[])
{
    /* C에서 3차원 배열을 동적으로 할당 */
    dataCube = TriArr(EXCEL_ROW, EXCEL_LINE, CELL_DATASIZE);
    // 메모리 해제
    FreeArr(EXCEL_ROW, EXCEL_LINE);

    /* C++에서 3차원 배열을 동적으로 할당 */
   TriAllocArr();
   // 메모리 해제
   DelAllocArr();

    return 1;
}
그림 그리기는 싫고 간단히 설명하자면 32 * 128 2차원 배열30100개 만들었다. ^^;
32행 30100열인 엑셀파일이라 보면 될 듯... 각 한개의 셀은 128자의 글이 써지고...

C와 C++간에 별 차이는 없다. malloc이냐 new인거냐 free인거냐 delete인거냐 차이정도이고 중요한건 모든 배열원소 초기화 해줘라... 안 그럼 뒷 일 책임 못진다. -_-;

// ================================= C 타입 ======================================
// 3차원 배열을 동적으로 할당
char*** TriArr(int number, int height, int width)
{
    int i, j, k;
    char*** ptr;
  
    if ( ( ptr = (char***)malloc(number * sizeof(char**)) ) == NULL )
    {
        printf("\nMemory allocation failure\n");
        exit(1);
    }

    for (i = 0; i < number; i++)
        if ( ( ptr[i] = (char**)malloc(height * sizeof(char*)) ) == NULL )
        {
            printf("\nMemory allocation failure\n");
            exit(1);
        }

    for (i = 0; i < number; i++)
        for (j = 0; j < height; j++)
            if ( ( ptr[i][j] = (char*)malloc(width * sizeof(char)) ) == NULL )
            {
                printf("\nMemory allocation failure\n");
                exit(1);
            }

    // 모든 배열원소 초기화(중요하다)
    for (i = 0; i < number; i++)
        for (j = 0; j < height; j++)
            for (k = 0; k < width; k++)
                ptr[i][j][k] = '\0';

    printf("\nMEMORY ALLOCATION(char) OK!\n");
    return ptr;
}
// 동적으로 할당 된 메모리 해제
void FreeArr(int number, int height)
{
    int i,j;
    for(i=0; i<number; i++)
    {
        for(j=0; j<height; j++)
        {
            free(dataCube[i][j]);
        }
        free(dataCube[i]);
    }
    free(dataCube);
}

// ================================= C++ 타입 =====================================
// 3차원 배열을 동적으로 할당
void TriAllocArr()
{
    int x, y, z;
    dataCube = new char**[EXCEL_ROW];

    for(int i=0; i<EXCEL_ROW; i++)
    {
        dataCube[i] = new char*[EXCEL_LINE];
        for(int j=0; j<EXCEL_LINE; j++)
            dataCube[i][j] = new char[CELL_DATASIZE];
    }
   
    // 모든 배열원소 초기화
    for (x = 0; x<EXCEL_ROW; x++)
        for (y = 0; y<EXCEL_LINE; y++)
            for (z = 0; z<CELL_DATASIZE; z++)
                dataCube[x][y][z] = '\0';
}
// 동적으로 할당한 메모리 해제
void DelAllocArr()
{
    for(int i=0; i<EXCEL_ROW; i++)
    {
        for(int j=0; j<EXCEL_LINE; j++)
            delete [] dataCube[i][j];
        delete [] dataCube[i];
    }
    delete [] dataCube;
}



'Dev > c, c++' 카테고리의 다른 글

이미지 오른쪽으로 90° 회전  (1) 2010.07.05
문자열 앞뒤 공백 지우기(수정)  (0) 2008.03.26
대부분의 형을 문자열로 바꾸기  (0) 2008.03.18

+ Recent posts