개발이야기/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. 함수 호출과 스택 동작 흐름

 

  1. A 함수가 B 함수를 호출하면:
    • B 함수의 스택 프레임이 생성되고
    • B의 매개변수/지역변수 공간이 할당되며
    • 복귀 주소가 저장됩니다.
  2. 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