단일 변수에 대한 동적할당 외에 포인터를 활용하여 배열 변수를 동적할당 할 수 있다. 컴파일 타임에 배열 길이를 정하는 고정 길이 배열과는 다르게 배열을 동적으로 할당하면 런타입 동안에 배열 길이를 선택할 수 있다.
동적으로 배열을 할당하려면, new 연산자와 delete연산자를 사용해야한다.
1. 1차원 배열 동적 할당 하기
1차원 배열은 배열의 이름이 곧 그 배열의 시작 주소이다.
int형 자료구조의 방을 가리키는 num 포인터 변수에 생성하고자하는 size를 가지는 동적 메모리를 할당한다.
#include<iostream>
using namespace std;
int main() {
//실행중에 배열의 크기 입력받아 1차원 배열 동적 할당하기
int length;
int* num;
cin >> length;
num = new int[length];
//1차원 배열 초기화 하기 (동적 배열은 const 상수로 미리 정의해야함)
for (int i = 0; i < length; i++) {
num[i] = i+1;
cout << num[i] << '\t';
if ((i+1) % 5 == 0) { cout << endl; }
}
//1차원 배열 메모리 해제
delete[] num; //delete num (X) 메모리 누수 오류 발생가능성 있음
}
delete[] num; //delete num (X) 메모리 누수 오류 발생가능성 있음
}

입력 및 출력 결과
2차원 배열 동적 할당하기
1) 오류 코드 (행과 열 동시에 동적 할당 시도)
2차원 배열일 때에는 행을 가리키는 포인터를 행의 수만큼 생성하고 각 행에 열을 동적할당 하여야 한다.
이때 행을 가리키는 포인터는 int* 형식을 갖는 배열의 시작주소를 가리키기 때문에 int ** 형을 갖는다.
따라서 2차원 배열을 동적할 때에는 행을 가리키는 포인터에대한 동적할당(행의 갯수만큼의 size를 갖는 메모리 동적할당)과 각행에 열의 크기만큼의 size를 갖는 메모리를 동적할당하는 순서로 구분하여 진행해야한다.
#include<iostream>
using namespace std;
int main() {
//실행중에 배열의 크기를 입력받아 2차원 배열 동적 할당하기
int w;
int h;
cin >> w;
cin >> h;
int** num;
num = new int[w][h];
//1차원 배열 초기화 하기 (동적 배열은 const 상수로 미리 정의해야함)
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
}
cout << endl;
num[i][j] = 5 * i + j + 1;
cout << num[i][j] << '\t';
}
//2차원 배열 메모리 해제
delete[] num;
}
2) 정답 코드 (행우선 동적 할당 -> 열 동적 할당)
#include<iostream>
using namespace std;
int main() {
//실행중에 배열의 크기를 입력받아 2차원 배열 동적 할당하기
int w;
int h;
cin >> w;
cin >> h;
//각 행을 가리키는 포인터를 행의 수만큼 할당 한 후, 각 행 배열의 시작주소에 열의 크기만큼 동적 할당
int** num = new int*[w];
for (int i = 0; i < w; i++) {
num[i] = new int[h];
}
//2차원 배열 초기화 하기 (동적 배열은 const 상수로 미리 정의해야함)
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
num[i][j] = 5 * i + j + 1;
cout << num[i][j] << '\t';
}
cout << endl;
}
//2차원 배열 메모리 해제
for (int i = 0; i < 5; i++)
{ delete[] num[i]; } //열을 가리키는 곁가지 메모리 해제
delete[] num; //행을 가리키는 기둥 메모리 해제
}

입력 및 출력 결과
'C++' 카테고리의 다른 글
08. C++_string class와 관련 기능 (0) | 2024.06.16 |
---|---|
07. C++_call by value/call by pointer/ call by reference 이해하기 (0) | 2024.05.16 |
05. C++_파일 입출력 (0) | 2024.05.15 |
04. C++_얕은복사/깊은복사 (1) | 2024.03.24 |
03. C++_invoke (0) | 2024.03.24 |