"자신이 원하지 않는 일을 남에게 시키지 마라." – 論語(논어)

2013/05/26

CPP 동적 2차원 배열

책보다가

‘…표현하는 편이 초보자에게 쉽게 느껴지겠지만 2차원 배열은 new로 생성할 수 없으므로…’

어?

그랬나?!

점점 바보가 되어 가는 느낌. c#만 3년 넘게 하다 보니 cpp에서 2차원 배열이 new[ ][ ] 하면 왜 안 되는지도 잊고 있었네요.

당연히 안됩니다. cpp에는 new[ ][ ] 연산자가 없지요. 참고로 c#에서는 됩니다. new[2][ ] 처럼 해야 하지만. 근데 이건 가변 배열이지요. 동적이 아니라서 런타임 도중 크기 변경도 안 됩니다. c#에 Array.Resize()라고 있기는 한데 이거도 그냥 크기 바꾼 배열을 하나 더 만들어서 기존 배열의 요소를 복사할 뿐 실제로 크기가 늘어나는 건 아닙니다. 근데 동적 할당도 크기 변경 시 결국 다른 곳에 더 크게 메모리를 잡고 값을 복사하는 작업을 하니 크게 보면 차이는 없겠네요.

얘기가 잠깐 옆으로 샜네요. 먼저 여기를 들어가 봅시다. 중간에 함수 목록에 보면 저런 거 없습니다. 없으니 당연히 안 되겠지요. 동적 다차원 배열을 만들려면 다중 포인터를 이용합니다.

int** a = new int*[ 2 ];

for ( int i = 0; i < 2; ++i ) {
    a[ i ] = new int[ 2 ];

    for ( int j = 0; j < 2; ++j ) {
        a[ i ][ j ] = ( i + 1 ) * ( j + 1 );
    }
}

for ( int i = 0; i < 2; ++i ) {
    for ( int j = 0; j < 2; ++j ) {
        std::cout << a[ i ][ j ] << std::endl;
    }

    delete a[ i ];
    a[ i ] = 0;
}

delete a;

a = 0;

돌려보면 1, 2, 2, 4 찍혀 나옵니다. 같은 식으로 3차원 배열을 만들려면 int***, 4차원 배열을 만들려면 int****, 5차원 배열을 만들려면 int***** 6차원 배ㅇㅕ…(고만해, 미친놈들아!) 안 쓰니 자꾸 잊어버리네요. 잊지 맙시다. ;ㅁ;

댓글 남기기 | cat > 타닥타닥 | tag >

댓글 남기기

* 표시된 곳은 반드시 입력해주세요