본문 바로가기
개발/C, C++

[C] C언어에서 힙 메모리와 스택 메모리

by candosh 2024. 11. 25.

 

이 부분이 궁금한 경우 메모리 할당 부분에서의 궁금증일텐데, 아래 위키피디아가 너무 설명이 잘되어 있어서 먼저 첨부한다!

https://ko.wikipedia.org/wiki/%EB%8F%99%EC%A0%81_%EB%A9%94%EB%AA%A8%EB%A6%AC_%ED%95%A0%EB%8B%B9

 

동적 메모리 할당 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 동적 메모리 할당 또는 메모리 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸

ko.wikipedia.org

 


출처 : 위키피디아

 

위의 사진 처럼 C언어의 메모리 영역 중 스택 메모리와 힙 메모리를 말하는 것이다.

1. 스택 메모리 (Stack Memory)

스택 메모리는 함수 호출과 함께 자동으로 할당되고, 함수가 종료되면 자동으로 해제되는 메모리 영역이다.

  • 고정 크기
    스택 메모리는 함수 호출 시, 컴파일러가 크기를 미리 결정한다.
  • LIFO 구조
    스택은 Last In, First Out(후입선출) 구조로 동작한다. 함수가 호출되면 스택에 데이터가 쌓이고, 함수가 종료되면 해당 데이터가 제거된다.
  • 자동 관리
    스택 메모리는 사용자가 따로 신경 쓰지 않아도, 함수 호출 및 종료 시 자동으로 관리된다.
  • 빠른 속도
    메모리 할당 및 해제 속도가 매우 빠르다.

사용 예시
스택 메모리는 함수 내 지역 변수와 함수의 매개변수, 리턴 주소 등을 저장하는 데 사용된다.

장점
자동 관리와 빠른 속도로 편리하게 사용할 수 있다.

단점
스택 메모리는 크기에 제한이 있어 큰 데이터를 저장하기 어렵다. 또한, 재귀 호출이 과도하면 스택 오버플로(Stack Overflow)가 발생할 수 있다.

 

2. 힙 메모리 (Heap Memory)

힙 메모리는 런타임 중에 프로그래머가 필요에 따라 직접 메모리를 할당하거나 해제할 수 있는 영역이다.

  • 동적 크기
    힙 메모리는 런타임에 동적으로 크기를 결정할 수 있다.
  • 수동 관리
    C에서는 malloc(), calloc(), realloc() 함수를 통해 메모리를 할당하고, free() 함수를 통해 메모리를 해제해야 한다.
  • 비교적 느림
    시스템 호출을 통해 메모리가 할당되기 때문에 스택 메모리에 비해 속도가 느리다.
  • 단편화 가능성
    메모리를 잘못 관리하면 메모리 단편화(Fragmentation)가 발생할 수 있다.

사용 예시
힙 메모리는 크기를 알 수 없는 데이터, 동적으로 생성된 배열이나 객체를 저장하는 데 사용된다.

장점
크기에 제한이 없으며, 유연하게 메모리를 사용할 수 있다.

단점
메모리 해제를 잊으면 메모리 누수(Memory Leak)가 발생할 수 있다. 또한, 이미 해제된 메모리에 접근하면 정의되지 않은 동작(Undefined Behavior)이 발생한다.

 

스택 메모리와 힙 메모리의 차이점

특징스택 메모리(Stack)힙 메모리(Heap)

메모리 관리 자동 관리 수동 관리
할당/해제 속도 빠름 느림
메모리 크기 제한적 (작은 크기) 유동적 (큰 크기 가능)
용도 지역 변수, 함수 호출 시 데이터 동적 데이터
단편화 없음 발생 가능
라이프사이클 함수 실행 중 존재, 함수 종료 시 소멸 해제되지 않으면 지속됨

 

3. 메모리 관리 시 주의점

  1. 스택 오버플로(Stack Overflow)
    스택 크기를 초과하면 프로그램이 비정상 종료될 수 있다. 특히, 깊은 재귀 호출은 스택 오버플로를 유발하기 쉽다.
  2. 힙 메모리 누수(Memory Leak)
    힙 메모리는 사용 후 반드시 free()를 호출해 해제해야 한다. 해제하지 않으면 메모리 누수가 발생해 시스템 자원을 낭비한다.
  3. 잘못된 메모리 접근
    스택에서는 범위를 벗어난 변수에 접근하면 예상치 못한 결과가 발생할 수 있다. 힙에서는 이미 해제된 메모리에 접근하면 프로그램이 비정상적으로 동작하거나 충돌할 수 있다.