📚 콜스택을 책 더미로 이해하기

콜스택은 "접시 쌓기" 또는 **"책 쌓기"**와 같다

🎯 핵심 원리

함수를 호출할 때마다:

  1. 스택 프레임이라는 "상자"가 스택 맨 위에 쌓인다
  2. 이 상자 안에는 함수의 지역 변수, 매개변수, 돌아갈 주소 등이 들어있다
  3. 함수가 끝나면 그 상자가 스택에서 제거

📝 간단한 예제로 이해하기

#include <stdio.h>

void funcC() {
    printf("C 함수 실행중\\n");
}

void funcB() {
    printf("B 함수 시작\\n");
    funcC();
    printf("B 함수 끝\\n");
}

void funcA() {
    printf("A 함수 시작\\n");
    funcB();
    printf("A 함수 끝\\n");
}

int main() {
    printf("main 시작\\n");
    funcA();
    printf("main 끝\\n");
    return 0;
}

🔄 실행 과정을 스택으로 표현

시간 순서 →

1. main 호출        2. funcA 호출       3. funcB 호출       4. funcC 호출
┌─────────┐        ┌─────────┐        ┌─────────┐        ┌─────────┐
│  main   │        │  funcA  │        │  funcB  │        │  funcC  │ ← TOP
└─────────┘        ├─────────┤        ├─────────┤        ├─────────┤
     ↑             │  main   │        │  funcA  │        │  funcB  │
   스택 시작        └─────────┘        ├─────────┤        ├─────────┤
                                      │  main   │        │  funcA  │
                                      └─────────┘        ├─────────┤
                                                        │  main   │
                                                        └─────────┘

5. funcC 종료       6. funcB 종료       7. funcA 종료       8. main 종료
┌─────────┐        ┌─────────┐        ┌─────────┐        
│  funcB  │ ← TOP  │  funcA  │ ← TOP  │  main   │ ← TOP   [스택 비움]
├─────────┤        ├─────────┤        └─────────┘        
│  funcA  │        │  main   │                           
├─────────┤        └─────────┘                           
│  main   │                                              
└─────────┘

🔍 스택 프레임의 구성 요소

각 함수의 스택 프레임에는 다음이 저장:

int calculate(int a, int b) {
    int result = a + b;  *// 지역 변수*
    int temp = result * 2;  *// 또 다른 지역 변수*
    return temp;
}

int main() {
    int x = 5;
    int y = 3;
    int answer = calculate(x, y);
    return 0;
}
calculate 함수의 스택 프레임
┌──────────────────────┐
│ 반환 주소 (main으로)  │ ← 함수 끝나면 어디로 돌아갈지
├──────────────────────┤
│ 매개변수 a = 5       │
├──────────────────────┤
│ 매개변수 b = 3       │
├──────────────────────┤
│ 지역변수 result = 8  │
├──────────────────────┤
│ 지역변수 temp = 16   │
└──────────────────────┘

⚠️ 스택 오버플로우 이해하기

스택 공간은 제한적. 너무 많이 쌓으면 넘친다