C++

09. C++_동적으로 배열 할당하기

만수르코딩방 2024. 5. 16. 18:30

단일 변수에 대한 동적할당 외에 포인터를 활용하여 배열 변수를 동적할당 할 수 있다. 컴파일 타임에 배열 길이를 정하는 고정 길이 배열과는 다르게 배열을 동적으로 할당하면 런타입 동안에 배열 길이를 선택할 수 있다.

동적으로 배열을 할당하려면, 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