메모리 구조

Shawn·2026년 2월 26일

프로그래밍

목록 보기
4/4
post-thumbnail

프로그램 메모리 구조

정보처리기사 실기를 공부하다보면 꼭 알아야 하는,
메모리 구조에 대해서 알아보려고 한다.
스택(Stack), 힙(Heap)의 차이, 컴파일 시점과 메모리 할당 차이를
이해하면 동적 메모리 할당과 Garbage Collection을 쉽게 이해할 수가 있다.

아래는 C언어를 기준으로 정리한 핵심 정리표이다.

영역설명
코드 영역 (Code)실행할 프로그램 코드가 저장됩니다.
데이터 영역 (Data)전역 변수와 static 변수가 저장됩니다.
힙 영역 (Heap)malloc()으로 할당한 메모리가 저장됩니다.
스택 영역 (Stack)지역 변수와 함수 호출 정보가 저장됩니다.

1. 프로그램 메모리 구조

C 프로그램이 실행되면 운영체제가 메모리를
4개의 영역으로 나누어 할당한다.

메모리는 코드, 데이터, 힙, 스택 영역으로 나뉜다.
힙은 위->아래, 스택은 아래->위로 자란다.

힙과 스택은 메모리의 빈 공간을 서로 마주보며 자란다.
힙은 아래로, 스택은 위로 확장을 하다가 만나게 되면
메모리 부족(Out of Memory)이 발생한다.

영역설명
코드 영역 (Code)실행할 프로그램 코드가 저장됩니다.
데이터 영역 (Data)전역 변수와 static 변수가 저장됩니다.
힙 영역 (Heap)malloc()으로 할당한 메모리가 저장됩니다.
스택 영역 (Stack)지역 변수와 함수 호출 정보가 저장됩니다.

왜 이런 순서일까?

  • 코드/데이터 영역이 낮은 주소에 있는 이유 : 프로그램 시작 시 가장 먼저 로드되고, 크기가 고정되어 있어서 미리 자리를 잡아둔다.
  • 힙과 스택이 양 끝에서 자라는 이유 : 둘 다 크기가 가변적이므로, 빈 공간을 최대한 활용하기 위해 반대 방향으로 자란다.

2. 스택(Stack) 영역

스택은 함수 호출 정보와 지역 변수를 관리하는 영역이다.

함수 호출 정보와 지역 변수가 무엇인지 모를 수 있으니,
아래에 내용을 정리해놓았다.

함수 호출 정보 : 함수가 호출될 때 스택에 쌓이는 데이터를 말한다.
매개변수, 지역 변수, 그리고 함수 실행이 끝난 뒤
돌아갈 위치(리턴 주소)가 하나의 스택 프레임(Stack Frame)으로
묶여 저장되고 함수가 종료되면 해당 프레임이 스택에서 제거된다.

지역 변수 : 함수(메서드) 안에서 선언된 변수이다.
함수가 호출될 때 생성되고, 함수가 종료되면 자동으로 사라지고
함수 바깥에서는 접근할 수 없다.

1. 스택의 특징

  • LIFO(Last In First Out, 후입선출) : 나중에 들어온 데이터가 먼저 나간다.
  • 자동 할당/해제 : 함수가 호출되면 할당, 종료되면 자동 해제
  • 크기 고정 : 컴파일 시점에 크기가 결정된다.
    void func() {
    	int a = 10; 		// 스택에 할당
         int arr = [5];	// 스택에 20바이트 할당	
    } // 함수 종료 시 a, arr 자동 해제

    2. 스택 오버플로우

    스택 크기는 제한되어 있어서, 너무 큰 배열을 선언하거나
    재귀 호출이 너무 깊으면 스택 오버플로우(Stack Overflow)가 발생한다.
    스택 메모리가 한계를 넘으면 운영체제가 프로그램을 강제 종료시킨다.
// 스택 오버플로우 가능
int arr[1000000]; // 약 4MB - 스택 한계 초과 가능

// 재귀가 너무 깊으면 스택 오버플로우
void infinite() {
	intfinite(); // 무한 재귀 - 스택 오버플로우
}

3. 데이터(Data) 영역

데이터 영역은 프로그램이 시작될 때 할당되고, 종료될 때 해제되는 영역이다.
전역변수와 static 변수가 이 영역에 저장된다.

int global = 10;  // 전역 변수 → 데이터 영역

void func() {
    static int count = 0;  // static 변수 → 데이터 영역
    count++;
}

static 변수는 함수 안에 선언되어 있지만,
데이터 영역에 저장 되어 함수가 종료되어도 값이 유지된다.

4. 힙(Heap) 영역

힙은 프로그래머가 직접 관리하는 동적 메모리 영역이다.

1. 힙의 특징

  • 런타임 할당 : 프로그램 실행 중에 크기 결정 가능
  • 수동 관리 : malloc( )으로 할당, free( )로 해제
  • 유연한 크기 : 큰 데이터도 저장 가능
// 수동으로 관리하기 위해, stdlib.h가 필요하다.
#include <stdlib.h>

void func() {
    // 힙에 할당 - 실행 중에 크기 결정 가능
    int *p = (int*)malloc(sizeof(int) * 1000000);

    // 사용 ...

    free(p);  // 수동으로 해제해야 함
}

2. 메모리 누수

free( )를 호출하지 않으면 메모리 누수(Memory Leak)가 발생한다.

메모리 누수란? malloc( )으로 할당받은 메모리를
free( )로 반환하지 않아서, 더 이상 사용하지 않는 메모리가
힙에 계속 쌓이는 현상이다.

void leak() {
    int *p = (int*)malloc(sizeof(int) * 100);  // 400바이트 할당
    // free(p)를 호출하지 않고 함수 종료
    // → p가 가리키던 400바이트는 힙에 남아있지만
    //   p 자체는 스택에서 사라져서 접근 불가능
}

int main() {
    for (int i = 0; i < 1000; i++) {
        leak();  // 호출할 때마다 400바이트씩 누적
    }
    // → 총 400KB의 메모리가 힙에 쌓이지만 사용할 수 없음
}

왜 문제가 되는 것인가?

상황결과
단발성 프로그램종료 시 OS가 모든 메모리를 회수하므로 큰 문제가 없다.
장시간 실행 (서버, 게임 등)메모리가 계속 쌓여서 시스템이 느려지거나 다운될 수 있다.

메모리 누수 방지 : malloc( ) 호출 횟수와 free( ) 호출 횟수가 항상 일치해야 한다.

void safe() {
    int *p = (int*)malloc(sizeof(int) * 100);
    // 사용 ...
    free(p);  // 반드시 해제
    p = NULL; // 해제 후 NULL로 초기화 (권장)
}

스택과 힙 비교

스택(Stack) - 자동으로 관리
힙(Heap) - malloc/free로 수동으로 관리

구분스택 (Stack)힙 (Heap)
할당 방식자동malloc()
해제 방식자동 (함수 종료 시)free() 호출
크기 결정컴파일 시런타임 시
속도빠름느림
크기 제한작음 (보통 1 ~ 8MB)큼 (시스템 메모리 전체)
사용 예지역 변수, 배열동적 배열, 연결 리스트
profile
기억하기 보단, 기록하는 개발자로 나아가고 있습니다

0개의 댓글