개발이야기/C언어
[C언어] 스택
Study & Stack
2025. 6. 15. 00:18
728x90
C 언어에서 함수 호출은 단순히 코드 이동이 아닌, 메모리 구조인 실행 스택(Stack) 위에서 동작합니다. 이 문서에서는 C 함수의 실행 흐름을 "스택 프레임(stack frame)"을 중심으로 설명합니다.
1. 실행 스택이란?
- 실행 스택은 현재 활성화된 함수 호출 정보를 추적하는 메모리 구조입니다.
- 스택(Stack)은 후입선출(LIFO) 구조로, 나중에 호출된 함수가 먼저 종료됩니다.
- 각 함수 호출 시마다 새로운 스택 프레임(stack frame) 이 생성되어 스택에 쌓입니다.
2. 스택 프레임(Stack Frame)의 구성 요소
각 함수 호출 시 생성되는 스택 프레임은 다음을 포함합니다:
- 매개변수 (parameters)
- 지역변수 (local variables)
- 복귀 주소 (return address): 함수 종료 후 되돌아갈 위치
- 이전 프레임 포인터 (optional, 함수 호출 관계 추적용)
3. 함수 호출과 스택 동작 흐름
- A 함수가 B 함수를 호출하면:
- B 함수의 스택 프레임이 생성되고
- B의 매개변수/지역변수 공간이 할당되며
- 복귀 주소가 저장됩니다.
- B 함수의 실행이 끝나면:
- 스택에서 B의 프레임이 제거되고
- 제어는 A 함수로 되돌아갑니다.
이 과정을 통해 함수 간 호출 관계와 지역 정보가 안전하게 관리됩니다.
4. 예제 코드로 보는 실행 스택
아래는 함수 호출 시 생성되는 스택 프레임을 시각적으로 나타낸 그림입니다. 함수 main()이 max()를 호출했을 때의 스택 구조를 보여줍니다.
- 각 사각형은 하나의 스택 프레임입니다.
- main() 함수가 먼저 실행되고, 그 위에 max() 함수의 프레임이 쌓인 상태입니다.
- 각 함수의 지역 변수와 매개변수는 해당 프레임 내부에만 존재하며, 서로 영향을 주지 않습니다.
#include <stdio.h>
int max(int n1, int n2); // 함수 선언
void print_table(int start, int stop);
int main() {
int x, y, larger;
printf("두 정수를 입력하세요: ");
scanf("%d %d", &x, &y); // 사용자 입력
larger = max(x, y); // max() 호출 → 새 스택프레임 생성
printf("더 큰 값: %d\n", larger);
print_table(x, larger); // print_table() 호출 → 또 다른 프레임 생성
return 0;
}
int max(int n1, int n2) {
if (n1 > n2)
return n1;
else
return n2;
}
void print_table(int start, int stop) {
for (int i = start; i <= stop; i++) {
printf("%d\t", i * i);
}
printf("\n");
}
📌 위 코드의 실행 시점별 스택 상태:
- main() 실행 시작 → main 스택 프레임 생성
- max(x, y) 호출 → max 프레임 생성
- max 반환 후 → main 프레임만 남음
- print_table() 호출 → print_table 프레임 생성
5. 재귀 함수에서의 스택 사용
재귀 함수는 자신을 다시 호출하므로 매번 새로운 스택 프레임이 쌓입니다.
int factorial(int n) {
if (n == 0) return 1;
return n * factorial(n - 1);
}
- factorial(3) → factorial(2) → factorial(1) → factorial(0) 까지 호출
- 각 호출마다 별도의 스택 프레임이 존재
- 반환 시 차례대로 제거됨 (후입선출 구조)
6. 요약 정리
개념설명
실행 스택 | 함수 호출 시 생성되는 프레임 저장소 |
스택 프레임 | 매개변수, 지역변수, 복귀주소 등 포함 |
활성 프레임 | 현재 실행 중인 함수의 스택 프레임 |
재귀 호출 | 호출될 때마다 새 프레임 → 반환 시 제거 |
호출 순서 | 나중에 호출된 함수가 먼저 반환됨 (후입선출 구조) |
실행 스택 개념은 C 언어 함수 호출뿐 아니라 디버깅, 성능 최적화, 재귀 알고리즘 이해에도 매우 중요합니다. 함수 호출 흐름을 시각적으로 이해하면 더 안정적인 프로그램을 설계할 수 있습니다.
728x90