동적 할당을 할 때, 자주 쓰는 함수 중 하나는 malloc입니다. 오늘은 이 함수에 대해서 간단하게 알아보고, 1차원, 2차원 배열을 어떻게 동적 할당하는지 배워보도록 하겠습니다.

 

 할당할 size를 인자로 받고, void형 포인터를 리턴하는데요. malloc가 리턴한 결과값에 적절하게 형변환을 해야 한다는 것을 의미해요. 이것만 보시면, 무슨 이야기인지 잘 모르실 듯 싶어서, 1차원 배열을 dynamic allocate 하는 걸 예로 들어보도록 하겠습니다.

 

 


 먼저 아래 프로그램을 보겠습니다.

 

 

 되게 어려운 것 같지만, 사실 5번째 줄이 핵심입니다. 저는 sizeof(int)에 5를 곱한 것 만큼 공간을 할당했는데요. 이는 5개짜리 int형 자료를 저장할 수 있는 space를 할당했다는 의미입니다.

 

 

 그러면 대충 이런 상황인데요. 이 때, malloc은 void형 포인터를 리턴합니다. 그냥 공간만 할당할 뿐이므로, int형을 가리키는지, 아니면 short를 가리키는지, char형을 가리키는지 모를 겁니다.

 

 

 그런데, 이것을 int형 포인터로 형변환 하면, 명확해 집니다. int형을 가리키는 포인터다. 그리고, 강제 형변환이 된 결과 값을 int형 포인터 arr에 넣습니다.

 

 

그러면 arr[3]은 어떻게 접근할 수 있을까요? arr이 동적으로 할당받은 공간의 시작 주소라면, int형의 크기 x 3만큼 이동하면 될 겁니다. 기준 주소값만 알고 있으면, random access가 가능한 게 배열이기 때문입니다.

 


 그러면 2차원 배열은 어떻게 하는 게 좋을까요? 사실 2가지 방법이 있습니다.

 

 

 그냥 1차원 배열처럼 쓰는 방법이 있습니다. n행 m열의 2차원 배열이라면, 그냥 nm개의 원소가 일렬로 나열이 되어 있다고 생각하는 겁니다. 그리고 실제로 r행 c열에 접근할 때, rm + c번째에 접근해서 가져오는 방법이 있습니다. 1행당 m개의 데이터가 있기 때문이에요.

 

 또 다른 방법은, int형 포인터 배열을 만든 다음에, int형 포인터가, 동적으로 할당된 int형 배열을 가리키게 하는 방법이 있습니다.

 

 

 7번째 줄을 봅시다. 그러면 int형 포인터 n개를 저장하기 위한 공간을 생성하고 있음을 알 수 있어요.

 

 

 그러면, 대충 이렇게 그림이 그려질 겁니다. int *을 가리키는 포인터는 int **입니다. pointer of pointer of int라고 하면 편할까요? 그러면 우리는 arr[0], arr[1], arr[2] 이렇게 접근이 가능할 겁니다. 그러면 여기에 무슨 값을 넣어야 할까요?

 

 

 int형 5개를 동적할당한 공간의 시작 주소를 넣으면 됩니다.

 

 

 즉, arr[0], arr[1], arr[2]는 int형 m개를 동적할당한 공간의 시작 주소값입니다. 대충. int형 배열의 시작 주소값을 가진다고 보면 명확할 듯 싶네요.