스택 프레임 개념
메모리의 스택(Stack) 영역은 함수의 호출과 관계되는 지역변수와 매개변수가 지정되는 영역
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
* 함수가 호출되면 스택에는 함수에 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소, 함수에서 선언된 지역 변수 등이 저장된다. 이렇게 스택 영역에 차례대로 저장되는 함수를 호출 정보를 스택 프레임(Stack frame)이라고 합니다.
스택은 후입 선출 LIFO(Last-in First-out) 방식이라고도 합니다.
스택 프레임 동작 방식
예제)
int main(void)
{
func1(); //func1() 호출
return 0;
}
void func1()
{
func2(); //func2() 호출
}
void func2()
{
}
Step 1
프로그램이 실행되면, 가정 먼저 main() 함수가 호출되며 스택 프레임이 스택에 저장
Step 2
func1() 함수를 호출하면, 해당 함수의 매개변수, 반환 주소 값, 지역 변수 등이 저장
*나머지 함수들도 똑같은 방식으로 스택에 저장됩니다.
Step 3
func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임이 스택에서 제거
*나머지 함수들도 똑같은 방식으로 스택에서 제거됩니다.
스택 오버플로우(Stack overflow)
함수의 재귀 호출이 반복되면, 해당 프로그램은 스택 오버플로우에 의해 프로그램이 비정상 종료가 될 수 있습니다.
만약 재귀 호출이 무한히 반복된다면, 아래 그림과 같이 마지막 메로리 주소 그림처럼 스택 프로임이 계속해서 쌓아져 가는데, 스택의 모든 공간을 다 사용하고 난 후 여유공간이 없을 때 다시 스택 프레임을 저장하게 되면 해당 스택 영역을 넘어가서 저장하게 됩니다.
위 그림처럼 해당 스택 영역을 넘어가도 데이터가 저장할 수 있으면, 해당 프로그램은 오동작을 하게 되거나, 보안상의 취약점을 가지게 된다.
'study > C언어' 카테고리의 다른 글
배열(Array) 과 포인터(Pointer) (0) | 2020.03.31 |
---|---|
함수(Function) 란? (0) | 2020.03.31 |
[C언어] printf 함수와 scanf 기본적인 이해 (0) | 2019.12.20 |
[C언어] 주석처리 (0) | 2019.12.20 |
[C언어] 1. HelloWorld (0) | 2019.12.20 |