나만의 작은 도서관
[C] 지긋지긋한 동적 메모리 2차원 배열 선언 방법 본문
개요
int arr[100000][100000]; // 스택 메모리 초과
문제를 풀다 보면 큰 배열을 정적 할당 방식으로 선언했을 때 "스택에 할당된 메모리 한도를 초과했다"는 메세지를 받는 경우가 종종 있다. 이는 정해진 크기를 할당받은 스택(stack)의 크기를 넘어갔기 때문인데, 이를 해결하기 위해선 힙(heap) 영역 메모리를 사용해야 한다. 사용 방법은 간단하다.
2차원 배열 동적 할당
#define ROWS 10
#define COLS 20
int **bus_cost = new int*[ROWS];
for (int i = 0; i < ROWS; i++) {
bus_cost[i] = new int[COLS];
}
이중 포인터가 각 배열을 가리키는 포인터들이 저장된 배열을 가리키도록 한다. 그런 다음, 배열을 순회하면서 각 포인터에 배열을 동적 할당한다. 위 예시로 설명하자면, 이중 포인터인 bus_cost가 배열을 가리키는 포인터 ROWS개가 저장되어 있는 배열을 가리키도록 초기화하고, 배열을 순회하면서 bus_cost [i] = new int [COLS]; 을 실행시켜 각 포인터가 COLS 크기의 배열을 가리키도록 한다. 결론적으로 bus_cost는 ROWS개의 포인터를 저장하는 배열을 가리키는 포인터이며, ROWS의 각 포인터는 COLS 크기의 배열을 가리키는 형태가 된다.
할당 이후 사용 방법?
똑같다. 동적 메모리 할당을 했다고 기존 2차원 배열이나 다르지 않다. 할당 방식이 다를 뿐 사용 방법은 똑같다.
int cost = 0;
for (int i = 0; i < M-1; i++) {
cost += bus_cost[changyoung[i]-1][changyoung[i + 1]-1];
}
주의사항: 해제는 따로 해줘야 한다.
정적 할당과 달리 동적 할당의 경우 메모리를 직접 해제해줘야 한다. 해제 구문을 적지 않았다고 오류가 나는 건 아니지만 메모리 누수가 발생하니 빠뜨리지 말고 적어주어야 한다.
// 동적배열 할당 해제.
for (int i = 0; i < MAXN; i++) {
delete[] bus_cost[i];
}
delete[] bus_cost;'C++ > 문법 및 메소드(STL)' 카테고리의 다른 글
| [C++][Keyword] 소속을 구분하기 위한 네임스페이스(namespace) (0) | 2024.12.21 |
|---|---|
| [문자열] 문자열을 정수로 stoi(), 숫자를 문자열로 to_string() (1) | 2024.03.21 |
| [문자열] str1 == str2 는 TRUE? (0) | 2023.09.10 |
| [문자열] 일부 문자열 반환 substr(), 문자열 길이 반환 length() (0) | 2023.06.25 |
| [문자열] 특정 문자열 찾기 find(), 문자열 부분 교체 replace() (1) | 2023.06.24 |