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열의 포인터를 사용할 필요가 없으니 그만큼 메모리를 아끼는 것이다.
'C,C++' 카테고리의 다른 글
[C++] STL : Standard Template Library 3 - 연결 리스트 (0) | 2018.07.06 |
---|---|
[C++] STL : Standard Template Library 2.2 -클래스 템플릿 (0) | 2018.07.06 |
[C++] STL : Standard Template Library 2.1 -함수 템플릿 (0) | 2018.07.06 |
[C++] STL : Standard Template Library 1 -표준 템플릿 라이브러리란? (0) | 2018.07.06 |
C, C++ 입출력 (0) | 2018.05.14 |
댓글