콜스택은 "접시 쌓기" 또는 **"책 쌓기"**와 같다
함수를 호출할 때마다:
#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 │
└──────────────────────┘
스택 공간은 제한적. 너무 많이 쌓으면 넘친다