1What — 동적 메모리란?
2- 프로그램 실행 중(런타임)에 필요한 만큼 메모리를 요청하고, 다 쓰면 반환하는 메커니즘
3- C에서는 \texttt{malloc}, \texttt{calloc}, \texttt{realloc}, \texttt{free}로 힙(heap) 영역을 직접 관리
4- 스택(stack) 메모리와 달리 함수가 반환되어도 유지되며, 프로그래머가 수명을 통제
5Why — 스택만으로는 왜 부족한가?
61. 크기를 컴파일 시점에 모른다
7 - 사용자가 입력할 문자열 길이, 네트워크 패킷 크기, 파일 행 수 — 모두 실행해봐야 알 수 있음
8 - \texttt{int arr[n];} (VLA)은 C99에서 허용되지만, 스택 오버플로 위험이 크고 C11에서는 선택 사항으로 격하 (ISO/IEC 9899:2011)
92. 스택은 자동 소멸한다
10 - 함수 내 지역 변수는 함수 반환 시 즉시 무효 → 함수 밖으로 데이터를 "살려서" 전달하려면 힙 할당 필수
11 - 예: 파서가 만든 구문 트리 노드를 호출자에게 넘겨야 할 때
123. 스택 크기가 제한적이다
13 - 일반 리눅스 기본 스택: 약 8 MB (\texttt{ulimit -s}로 확인)
14 - 수백 MB 이미지 버퍼, 수백만 레코드 배열은 스택에 넣을 수 없음
15Why — 실제 시스템에서 동적 메모리 없이는 불가능한 것들
16- OS 커널: 프로세스 생성마다 PCB(Process Control Block)를 동적 할당 — 프로세스 수를 컴파일 시 고정할 수 없음 (Silberschatz, 2018)
17- 데이터베이스: 쿼리 결과 행 수가 매번 다름 → 버퍼 풀을 힙에서 관리 (Ramakrishnan, 2003)
18- 웹 서버: 동시 접속 클라이언트마다 연결 구조체를 할당·해제 — nginx는 커스텀 메모리 풀 사용
19- 가변 자료구조: 연결 리스트, 트리, 해시 테이블 — 노드를 하나씩 동적 생성
20How — 스택 vs 힙 비교
21- 스택 할당: 자동, 빠름(포인터 이동만), 함수 종료 시 소멸, 크기 고정
22- 힙 할당: 수동(\texttt{malloc}/\texttt{free}), 상대적으로 느림, 프로그래머가 수명 제어, 크기 가변
23- 전역/정적: 프로그램 시작~종료까지 존재, 크기 고정
24How — 동적 할당의 기본 흐름 (미리보기)