[C] 스택 프레임
스택 자료구조는 나중에 들어간 요소가 먼저 나오는 LIFO형태를 갖춘 자료구조이다.
함수가 동작할 때 스택 구조로 동작하게 된다. 메모리구조와 함수에 대해 알아보자.
사실 Data Segment와 Code Segment부분은 함께 붙어서 하드디스크에 존재한다고 생각해도 된다.
전역변수와 정적변수는 서로 비슷한 성질을 가져 혼용되어 사용하기도 하지만, 정적변수는 전역변수와는 달리 초기화가 한 번만 발생한다.
즉, static키워드가 붙은 정적변수는 프로그램이 시작될 때 한 번만 초기화되며, 함수의 매개변수로 사용할 수 없다.
프로그램을 실행할 때 데이터는 Data Segment / Stack Memory / Heap Memory 세 구간으로 나뉘어 위치하게 된다.
여기서 Data Segment부분의 전역변수와 정적변수는 크기가 고정돼있어 문제가 없지만, Stack과 Heap은 프로그램 실행 중 크기가 변화한다. Stack의 메모리가 넘치게 되면 StackOverFlow오류가 발생한다.
함수를 호출할 때 마다 스택 메모리에 스택 프레임을 push한다. (활성화 레코드라고도 한다)
- 매개변수
- 지역변수
- 리턴주소
- 리턴값
스택 프레임은 총 4가지로 구성된다.
여기서 지역변수가 포함되는데, 함수가 호출될 때 생겨났다가 리턴을 만나면 지역변수가 사라지는 이유를 알 수 있다.
이제 위의 그림을 직관적으로 이해할 수 있을 것이다.
메모리 모습을 살펴보자.
우선 메인 메서드는 아무도 불러주지 않으니 운영체제가 불러준다고 생각하자.
운영체제에 의해 메인메서드가 호출되고 메인의 스택 프레임이 스택에 들어간다.
이 때 리턴 주소는 운영체제의 주소이다.
스택 프레임은 함수를 호출하기 이전 상태를 기록한다.
1004번지에서 add함수를 호출하게 되는데, 스택 프레임을 통해 main의 상태를 기록하고 add함수의 스택 프레임을 스택에 넣는다.
int형은 4바이트의 메모리 크기를 차지하고, short형은 2바이트의 메모리 크기를 차지하는 것 처럼 변수가 선언될 때는 그 변수가 차지하는 메모리의 크기가 명시되어야 한다.
스택 프레임의 크기는 컴파일 하는 시점에 결정되고, 매개변수와 지역변숭의 개수와 타입을 고려해서 결정된다.
C에서는 가비지 컬렉터가 없기 때문에, 함수가 리턴되더라도 변수에 선언된 값들은 지워지지 않는다.
그러니, 함수를 정의할 때 변수를 꼭 초기화하도록 하자.
스택에 있는 맨 위의 스택 프레임만 활성화되는걸 기억하자.
활성화 되어 있는 스택 프레임의 변수만 읽어올 수 있다.
'Programming Language > C' 카테고리의 다른 글
[C] 배열 (0) | 2022.03.28 |
---|---|
[C] 함수 간 소통 / 재귀 (0) | 2022.03.22 |
[C] Register / Volatile (0) | 2022.03.22 |
[C] Scope (0) | 2022.03.22 |
[C] 입문 (0) | 2022.03.22 |
댓글
이 글 공유하기
다른 글
-
[C] 함수 간 소통 / 재귀
[C] 함수 간 소통 / 재귀
2022.03.22 -
[C] Register / Volatile
[C] Register / Volatile
2022.03.22 -
[C] Scope
[C] Scope
2022.03.22 -
[C] 입문
[C] 입문
2022.03.22