본 프로그램은 n명의 학생 각각이 m개의 과목을 수강할 경우에 대한 

2차원 배열을 선언하는 형태인데 학생 수가 고정되어 있지 않고 가변이고

각 학생의 수강 과목도 고정되어 있지 않고 각각 상이하다고 할 때의 

상황이다. 이때 가장 적합한 2차원 배열의 형태가 "2차원 포인터(포인터의 포인터)"

형태로 선언하는 것에 대한 예제 코드이다.


#include <iostream>

#include <malloc.h>


using namespace std;


void main()

{

//2차원 포인터는 2차원 배열의 형태를 갖는데 

//세로(행, row)도 가변적인 배열, 가로(열, column)도 가변의 크기를 갖는 배열이라는 뜻이다.

int** score;

int studentNum = 0;

int lessonNum = 0;

int allTotalSize = 0;


cout << "학생 수 입력 : ";

cin >> studentNum;


//studentNum 갯수 만큼의 크기를 가진 배열이 선언되는데 이 배열의 각 원소가

//int형 포인터 변수이므로 각 원소가 또 동적 할당으로 임의 크기의 배열의 시작 주소를

//가리키게 되므로 결국 2차원 배열이 되는 것이다.

//즉 studentNum 갯수 만큼의 크기를 가진 int형 포인터 변수가 배열 형태로

//선언되고 그 시작 주소 값을 score에 저장한다.

//통상적으로 이렇게 생성되는 배열을 2차원 배열의 행(row, 가로)의 크기로 본다.

score = new int*[studentNum];

cout << "sizeof(score) : " << sizeof(score) << " byte" << endl;

cout << "_msize(score) : " << _msize(score) << " byte" << endl << endl;


//_msize()함수에 대해: new로 생성된 메모리는 heap 메모리 영역에 생성되고

//heap 메모리 영역은 운영체자가 관리해 주기 때문에 동적 할당된 메모리의 크기를

//알기 위해서는 운영체제의 도움이 필요하다.

//윈도우의 경우 _msize()함수를 통해 알수 있다.

//반면에 sizeof()함수는 포인터 변수 자체의 크기를 반환하는데 포인터 변수는 항상 4byte로 동일하다

//아래의 코드는 score가 가리키는 동적 할당된 메모리 전체의 크기를 반환한다.

//score = new int*[studentNum]으로 할당되었기에 

//studentNum * 4(int형의 크기가 4byte이므로)의 크기를 가진다.

allTotalSize = _msize(score);


//studentNum 갯수 만큼의 배열 각 요소인 int형 포인터 변수 각각에 대해

//동적 메모리 할당을 통해 또 다시 배열을 만든다. 따라서 2차원 배열이 되는 것이다.

//통상적으로 이렇게 생성되는 배열을 2차원 배열의 열(column, 세로)의 크기로 본다.

for (int i = 0; i < studentNum; i++)

{

cout << (i+1) << "번 학생의 수강 과목 수 : ";

cin >> lessonNum;


score[i] = new int[lessonNum];

allTotalSize += _msize(score[i]);

cout << (i + 1) << "번째 배열의 크기 : " << _msize(score[i]) << " byte" << endl << endl;

}


cout << endl << "2차원 포인터 배열 전체의 크기 : " << allTotalSize << " byte" << endl;


//여기서 성적 입력 및 평균, 총점 처리...


//메모리 해제(동적 할당된 메모리는 사용후 반드 해재해 줘야함!)

for (int i = 0; i < studentNum; i++)

{

delete[] score[i];

//delete score[i]; //이 경우는 i번째 배열 전체가 아닌 그 배열의 시작 주소만 해제 함

}


delete[] score;


cout << endl << "동적 할당 메모리 해제 완료~" << endl;

}


실행 결과는 다음과 같다.








'C++' 카테고리의 다른 글

C#의 .dll Library를 C++에서 활용하기  (0) 2017.12.08
memcpy()함수를 이용한 문자열 복사 하기  (0) 2017.07.25

+ Recent posts