Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 스택(Stack)의 성장 방향을 확인하는 프로그램

스택(Stack)은 데이터를 저장하는 대표적인 자료구조로, 두 가지 기본 연산을 제공합니다. push는 스택에 새로운 요소를 추가하는 연산이고, pop은 스택에서 요소를 제거하는 연산입니다.

흥미로운 점은 스택이 메모리상에서 위쪽(높은 주소 방향)으로 성장할 수도 있고, 아래쪽(낮은 주소 방향)으로 성장할 수도 있다는 것입니다. 실제 성장 방향은 컴파일러와 운영체제, 그리고 해당 프로그램이 동작하는 환경에 따라 달라집니다. 이번 글에서는 C 언어를 이용해 현재 실행 중인 프로그램에서 스택이 어느 방향으로 성장하는지 확인하는 방법을 알아보겠습니다.

알고리즘

스택의 성장 방향을 판별하는 핵심 원리는 간단합니다. 서로 다른 함수에 선언된 지역 변수들의 메모리 주소를 비교하면 됩니다.

1단계: main 함수 안에 지역 변수를 하나 선언한다.
2단계: 지역 변수를 가지는 별도의 함수를 정의한다.
3단계: main 함수에서 해당 함수를 호출한 뒤, 두 함수의 지역 변수 주소를 비교한다.
4단계: main 함수의 지역 변수 주소와 호출된 함수의 지역 변수 주소를 비교한다.
5단계: main 함수의 변수 주소가 함수 내부 변수의 주소보다 크면 스택은 위쪽으로 성장하는 것이고, 그렇지 않으면 아래쪽으로 성장하는 것이다.

예제 코드

아래 예제에서는 main 함수의 지역 변수 주소를 매개변수로 전달하여, 호출된 함수 내부의 지역 변수 주소와 비교합니다.

#include<stdio.h>
void fun(int *main_local_addr){
   int fun_local;
   if (main_local_addr < &fun_local)
      printf("Stack grows upward\n");
   else
      printf("Stack grows downward\n");
}
int main(){
   int main_local;
   fun(&main_local);
   return 0;
}

실행 결과

Stack grows downward

동작 원리 설명

위 코드가 어떻게 작동하는지 살펴보겠습니다.

  • main 함수 호출: main 함수가 실행되면 지역 변수 main_local이 스택에 할당됩니다.
  • fun 함수 호출: main에서 fun을 호출하면 새로운 스택 프레임이 생성되고, 그 안에 지역 변수 fun_local이 할당됩니다.
  • 주소 비교: fun 함수 내부에서 main_local의 주소와 fun_local의 주소를 비교합니다.

대부분의 x86 계열 시스템에서는 스택이 높은 주소에서 낮은 주소 방향, 즉 아래쪽으로 성장하기 때문에 위 코드는 "Stack grows downward"를 출력합니다. 반대로 스택이 낮은 주소에서 높은 주소 방향으로 성장하는 시스템이라면 "Stack grows upward"가 출력됩니다.

이처럼 단순히 두 지역 변수의 주소 크기만 비교하더라도, 실행 환경에서 스택의 성장 방향을 손쉽게 확인할 수 있습니다.