동적 할당 함수와 이중포인터 사용 목적

2025년 정처기 실기 기출문제 11번 개념 분석

by Younggi Seo





일단 C언어에서 개념은 누구나 이해할 수 있다. 이해는 본래 암기가 선행되지 않고, 깨닫는 과정이기 때문에 개념만 이해했다고 문제 해결을 위한 코딩을 할 수 있는 건 아니다. 프로세스(문제에 적용하는 과정)는 실제로 문제를 해결하는 과정에서 숙달이 된다. 이거 역시 반복학습으로 머릿속에 임의로 할당된(malloc() 함수와 같은) 메모리 공간(개념을 연결시키기 위한 부하)을 줄이면서 실제 문제를 풀어 숙달시킬 수 있다.


C언어는 하드웨어(메모리 단)의 프로그램 작동원리를 일반화시킨 고급 언어들의 특성(이를테면 가비지 컬렉션과 같은)인 추상성을 제거한 언어라고 하지만, 역설적으로 이중 포인터라는 실제 데이터의 주소 값이 담긴 메모리의 주소 값만으로 연산을 하기 위한 개념을 만들었다. 약간 뭐랄까? 금융 펀드의 대국, 룩셈부르크*처럼 실제 자본은 없는데, 그 자본을 거래하기 위한 펀드라는 개념을 만들어서 간접 자본의 금융거래를 하는 것처럼 말이다. 아래 정처기 실기 기출문제가 작년 1회 차 때 출제된 동적 할당 함수와 이중포인터 개념을 이해하고 있는지 동시에 묻는 코딩 문제다.



11. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.


이 프로그램에서 이중 포인터malloc을 사용한 핵심 이유는 "메모리를 유연하고 입체적으로 관리하기 위해서"라는 구글 AI모드의 분석답변을 시작으로 초심자(필자)의 눈높이에서 3가지 포인트로 정리해 봤다.


개념 정리

1. 런타임에 크기를 결정하기 위해 (가장 큰 이유)

일반 배열 int arr[3][3]은 프로그램이 시작되기 전(컴파일 타임)에 크기가 딱 고정되어야 합니다. 하지만 현실에서는 사용자에게 "몇 행 몇 열로 만들까요?"라고 물어본 뒤 공간을 만들어야 할 때가 많죠.

malloc을 쓰면 프로그램 실행 중에 rows와 cols 변수 값에 맞춰서 딱 필요한 만큼의 땅을 빌릴 수 있습니다.


2. "진짜 표(Grid)" 구조를 만들기 위해

컴퓨터 메모리는 사실 기다란 일직선 형태입니다. 그런데 우리는 데이터를 행과 열이 있는 2차원 표처럼 다루고 싶어

이중 포인터(int**)는 '행들의 주소를 담은 리스트'와 '실제 데이터가 담긴 열'을 연결해 줍니다.

덕분에 arr [행][열]이라는 직관적인 문법을 그대로 쓸 수 있게 되어 코드가 훨씬 읽기 편해집니다.


3. 큰 데이터를 효율적으로 다루기 위해

일반 지역 변수(스택)는 공간이 매우 작아서 큰 배열을 만들면 프로그램이 픽 쓰러질 수 있습니다.

malloc은 '힙(Heap)'이라는 아주 넓은 광장에서 공간을 빌려옵니다.

또한, 이중 포인터를 쓰면 행 전체를 통째로 옮기지 않고 주소값만 바꿔서 행의 순서를 바꾸는 등 고급 기술을 부리기에도 유리합니다.


한 줄 요약:

이중 포인터와 malloc은 ‘프로그램 실행 중에 내가 원하는 크기의 2차원 표를 넉넉한 공간에 만들기 위해’ 사용



동적할당 저장 공간의 활용 3가지 키워드로 끝내는 핵심

입력하는 문자열의 길이에 딱 맞는 가변 메모리 공간(Heap)을 확보할 수 있다.

명령행 인수(argc - 명령행 문자열의 수, argv - 명령행의 문자열)의 구현 방식을 이해할 수 있다.

동적 할당 방식이 복잡할수록 할당 영역은 빠짐없이 반환해야 한다.



기출문제 소스코드를 직접 참고하려면 아래 필자의 깃헙(github)에서 직접 다운로드할 수 있다.



* 룩셈부르크