스택 프레임은 함수 호출과 반환 과정에서 사용되는 데이터 구조로, 주로 함수 호출 시 함수의 지역 변수,
반환 주소, 매개변수 등을 저장하는 데 사용된다.
스택 프레임은 프로그램이 실행될 때마다 생성되고, 함수가 반환될 때마다 소멸된다.
📌 스택 프레임 지정원리 #1
- 스택 메모리 주소는 0번지를 향해 증가한다.
- 지역변수는 선언한 순서대로 스택에 Push 한다.
- 매개변수는 오른쪽부터 스택에 Push 한다.
- 스코프 단위로 끊어서 표시한다. ( 함수는 별도 단락으로 표시한다. )
📌 스택 프레임 지정 ( 지역변수 )
예제를 통해 살펴보자
#include<stdio.h>
int main(void)
{ // 1번째 스코프
int a = 3; // 1번째 a
int b = 4;
int aData[5] = { 0x10, 0x20, 0x30, 0x40, 0x50 };
printf("a: %d\n", a); // 1번째 a가 출력
if(a > 2) // 1번째 a를 확인
{ // 2번째 스코프
int a = 5; // 2번째 a
printf("a: %d\n", a); // 2번째 a가 출력
}
return 0;
}
위 코드를 실행할때 스택 영역에 쌓이는 데이터를 그림으로 살펴보면 다음과 같다.

첫번째 a와 2번째 a는 이름은 같지만 메모리에 적재되는 위치가 다르기 때문에 다른 지역 변수라고 생각할 수 있다.
실제 메모리에 어떻게 들어가는지 확인해보자.

그림으로 표시한 Stack 영역처럼 메모리에도 순서대로 데이터가 쌓이는 것을 확인할 수 있다.
위 구조는 32비트 환경에서 빌드한 것인데, 64비트 환경에서 빌드하면 전혀 다른 스택 프레임이 나타난다.

64비트 환경에서는 Stack이 아래로 쌓이는 것을 확인할 수 있다.
64비트에서는 Stack 영역을 최대값까지 증가된 채로 지정해 놓고 위에서 아래로 내려오는 방식으로 관리하는 것
📌 스택 프레임 지정 ( 함수 )
예제를 통해 살펴보자
int add(int a, int b);
위와 같은 함수가 있을때 호출하면 스택 프레임에 매개변수가 쌓이는 순서는 아래 그림과 같다.

앞서 언급한것 처럼 매개변수는 오른쪽부터 아래에 순서대로 쌓인다.
#include <stdio.h>
int add(int paramA, int paramB)
{
int a = paramA;
int b = paramB;
printf("a: %d b: %d", a, b);
}
int main()
{
add(3, 4);
return 0;
}
위 코드를 실행할때 함수안에 지역변수가 있으면 매개변수가 먼저 쌓일까? 지역변수가 먼저 쌓일까?
32비트 환경에서 메모리를 살펴보자.

메모리를 살펴보면 위 그림과 같다. 매개변수가 먼저 쌓이고, 이후 지역변수가 쌓이는 것을 확인할 수 있다.
64비트 환경에서 메모리를 살펴보자.

32비트 환경과는 완전히 다른 구조로 변경되어 있는것을 확인할 수 있다.
📌 스택 프레임 지정원리 #2
- 함수 반환 시 해당 함수가 사용한 스택 메모리는 삭제된다.
- 전역, 정적 변수는 스택을 사용하지 않는다.