학부내용 예습/[ 2021 겨울 ] C++

[ C++ ] 6강. 동적할당

haena02 2022. 1. 28. 17:41
반응형

정적할당

- 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것

- 더 큰 입력이 들어오면 처리못하고 더 작은 입력이 들어오면 메모리 낭비

 

동적할당

- 실행 도중에 동적으로 메모리를 할당 받는 것 (heap영역)

- 사용이 끝나면 메모리 반납

int *pi;  // 동적 메모리를 가르키는 포인터, 주소값 저장
pi = new int;  // 동적 메모리 할당 , new는 주소 리턴
*pi = 100;  // 동적메모리 사용
delete pi;  // 동적 메모리 반납

int* arr = new int[3];  // 동적인 배열 생성
delete[] arr;  // 배열 메모리 삭제

//2차원 배열 모두 동적으로 받기
int **p = new int*[ROW];
for (int i=0;i<ROW;i++){
	parr[i]=new int[COL];  }
    
// 배열 삭제
for (int i=0;i<ROW;i++)
	delete[] parr[i]
delete[] parr;

2차원 배열에서 층과 방을 모두 동적으로 받는 내용을 처음봤을 때 읭스러웠다

그건 아마 내가 포인터 개념을 좀 잊었기 때문...

차근차근 정리해보니 이해가 조금 되었는데 까먹을거같아서 나만의 방식으로 적어놔야겠다.

 

p는 배열 층의 시작 주소를 저장한다

배열 층은 각 층의 방의 시작 주소를 저장한다

따라서 p는 이중포인터가 되고 배열은 포인터 배열이 된다.

 

/* 파일에 있는 맵 데이터를 읽어, 크기만큼 맵을 생성하고 맵데이터를 읽은 후 출력하기
 
맵데이터
4 3
1 1 1
1 0 1
1 1 1
1 0 0
*/

#include <iostream>
#include <fstream>

using namespace std;

int** readMap(const char* fileName, int& r, int& c) { // 파일 열어서 배열 생성해서 리턴

	ifstream fin(fileName);  //파일 열기
	int** map = NULL; //리턴할 배열

	if (fin.is_open()) { // 열려 있다면
		int row, col;
		fin >> row >> col;
		r = row;
		c = col;
		map = new int*[row];
		for (int i = 0; i < row; i++) {
			map[i] = new int[col];
			for (int j = 0; j < col; j++) {
				fin >> map[i][j];
			}
		}
	}
	else {
		cout << "파일 확인 요함" << endl;
	}
	
	return map;
}

void showMap(int** (&map), const int& r, const int& c) {// 참조자 사용으로 데이터 아끼기

	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cout<< map[i][j];
		}
		cout << "\n";
	}
}

int main() {

	int row, col;
	int** map = readMap("map.txt", row, col);

	if (map != NULL) {
		showMap(map, row, col);
	}


	return 0;

}

 

 

반응형