이런 분들이 찾고 있어요
이 레슨과 관련된 학습 키워드
코드를 읽고 설명하면, 합격합니다
이 레슨과 관련된 학습 키워드
C 프로그래밍 — 하드웨어에 가장 가까운 언어 → 포인터와 메모리
1# C 의사코드 (Python 아님 — 흐름 이해용)2# 1. 요청: int *p = (int *)malloc(n * sizeof(int));3# 2. 검사: if (p == NULL) { /* 할당 실패 처리 */ }4# 3. 사용: p[0] = 42;5# 4. 반환: free(p); p = NULL;오늘은 동적 메모리가 왜 필요한지 살펴보겠습니다.
프로그램 실행 중 메모리는 크게 두 영역에서 옵니다.
스택과 힙, 이 두 영역의 차이가 오늘의 핵심이에요.
그림 왼쪽 상단을 보시면 스택의 세 가지 한계가 보입니다.
첫 번째, 크기를 컴파일 시점에 모릅니다.
사용자 입력 길이나 파일 행 수는 실행해봐야 알 수 있죠.
가변 길이 배열은 C99에서 허용되지만 C11에서는 선택 사항으로 격하됐습니다.
두 번째, 스택은 함수가 끝나면 자동으로 소멸합니다.
데이터를 살려서 함수 밖으로 넘기려면 힙 할당이 필수죠.
세 번째, 스택 크기가 매우 제한적입니다.
리눅스 기본 스택은 약 8메가바이트, 수백 메가 버퍼는 불가능합니다.
그림 오른쪽을 보시면 C의 수동 메모리 관리 철학이 보입니다.
말록, 캘록, 리얼록, 프리로 힙을 직접 관리합니다.
런타임에 크기를 결정하고 기가바이트 단위까지 요청할 수 있습니다.
가운데 비교표를 보시면 스택과 힙의 차이가 한눈에 들어옵니다.
스택은 자동 할당, 매우 빠름, 함수 종료 시 소멸, 크기 고정입니다.
힙은 수동 할당, 상대적으로 느리고, 프리 호출까지 수명이 유지됩니다.
힙 크기는 기가바이트 단위까지 가변적으로 쓸 수 있습니다.
그림 하단을 보시면 동적 메모리 없이 불가능한 시나리오들이 있습니다.
OS 커널은 프로세스마다 피씨비를 동적 할당합니다.
데이터베이스는 쿼리 결과 행 수가 달라 버퍼 풀을 힙에서 관리합니다.
웹 서버는 동시 접속마다 연결 구조체를 동적 할당하고 해제합니다.
연결 리스트, 트리, 해시 테이블도 노드를 동적으로 생성해야 합니다.
하단 흐름도를 보면 동적 할당은 네 단계로 이루어집니다.
말록으로 요청하고 반드시 널 검사를 해야 합니다.
이후 데이터를 사용하고 마지막으로 프리로 반환합니다.
프리 후 포인터를 널로 설정하면 댕글링 포인터를 방지합니다.
동적 메모리는 편의 기능이 아니라 필수 메커니즘입니다.
커니건과 리치 1988년 이후 C가 시스템 언어로 쓰이는 이유죠.
메모리 누수, 댕글링 포인터, 이중 해제 — 모두 프로그래머의 책임입니다.