본문 바로가기
C,C++

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

by matters_ 2018. 7. 4.

2차원 배열을 동적할당은 바로 못한다고 한다 그래서 2차원 배열 동적 할장 방법에 대해 찾아보았다.

 

 

안녕하세요.

C++ 에서 2차원 배열을 동적으로 할당하고, 해제하는 방법입니다.

 

아래 코드에서는 string.h 를 inclue 하는데요, 메모리 관련 함수이면서 string.h 에 포함된 점이 특이합니다.

memory.h 를 사용해도 된다지만 string.h 가 표준이라고 합니다.

 

StakOverflow : How do I declare a 2d array in C++ using new?

링크의 답변 중에는 2차원 배열을 하나의 memory block 에 할당하는 방법(포인터들의 크기만큼 메모리 절약)에 대한 답변과,

new - delete 보다는 std::vector<int> 를 사용하라는 답변도 있습니다.

 
#include <string.h>   // memset 함수 사용을 위해 include
 
/* 메모리 할당 */ 
int **arr = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
    arr[i] = new int[sizeX];
    memset(arr[i], 0, sizeof(int)*sizeX);   // 메모리 공간을 0으로 초기화
}
 
/* 메모리 해제 */
for(int i = 0; i < sizeY; ++i) {
    delete [] arr[i];
}
delete [] arr;

 

이상으로 C++ 에서 2차원 배열을 동적으로 할당하고, 해제하는 방법을 살펴 보았습니다.

도움이 되었기 바랍니다.


출처: http://felixblog.tistory.com/72 [오늘, 행복하자!]

 

 

여기서 질문 하나 꼭 위의 방법밖에 방법이 없을까 다른 방법은 없는 것일까?

stackoverflow 답변에서 2차원 배열을 하나의 memory에 할당하는 방법과 new -delete 보다는 std::vector<int>를 사용하는 방법이 있다고 한다.

그렇다면 2차원 배열을 하나의 memory에 할당하는 방법부터 알아보자

 

 

2차원 배열 sizeX * sizeY 배열이 있다고 해보자 그렇다면 이걸 그냥 1차원 배열로 나열해서 

2차원 배열 선언시 필요했던 new int*[sizeY]부분을 선언하지 않아도 되니 메모리를 아낄 수 있다

int **arr =new int *[sizeY];

for(int i=0;i<sizeY;i++) {

arr[i]=new int[sizeX];

memset(arr[i],0,sizeof(int)*sizeX);

}

 

 

2차원 배열은 이렇게 선언했다면

int *arr = new int[sizeX*sizeY];

memset(arr[i],0,sizeof(int)*sizeX*sizeY);
 

이렇게 1차원 배열로 사용하는 것이다.

sizeX열의 포인터를 사용할 필요가 없으니 그만큼 메모리를 아끼는 것이다.

 

 

 

 

 

 

 

댓글