스택
스택이란 나중에 입력된 것이 먼저 출력되는 자료구조입니다.(LIFO, Last In First Out)
PUSH, POP, TOP등의 연산이 있습니다.
함수를 한번 생각해 보면, 함수는 나중에 호출된 함수일수록 먼저 return됩니다.
이는 사실 함수를 호출할 때마다 스텍 메모리에 스택 프레임을 push하며, 함수가 종료되었을 때에는 스텍 메모리에서 pop을 수행하기 때문입니다.
스택프레임
스택프레임은 함수가 호출되기 이전의 상태를 기록하는 역할을 합니다.
즉 함수를 호출하기 직전까지의 상태를 기록하였다가, 함수가 리턴된 이후 호출한 함수의 이전 상태를 복원하는 역할을 합니다.
스택 프레임에는 다음과 같은 내용들이 포함됩니다.
스택 프레임의 내용
매개 변수(Parameter) : 호출 함수가 전달한 인자 값
지역변수(Local Variables) : 함수 내에서 선언한 변수
리턴 주소(Return Address) : 함수 실행을 마친 다음 실행할 명령문의 주소
리턴 값(Return Value) : 호출 함수에게 돌려줄 값
스택 프레임은 활성화 레코드(Activation Record)라고 부르기도 합니다.
참고 - C언어의 메모리 구조
(Heap과 Stack의 위치는 서로 바뀔 수 있습니다.)
스택 프레임이 스택 메모리에 add된다면, 그 이전에 존재하는 스택 프레임은 모두 비활성 상태가 되며, 가장 마지막에 PUSH한 스택 메모리만이 활성 상태가 됩니다.
즉 매 순간 스택 메모리의 top 에 존재하는 하나의 스택 프레임만 활성화되며, 비활성화된 스택 프레임의 지역변수에는 접근이 불가능합니다.
스택 프레임의 크기는 매개변수와 지역변수의 개수와 타입을 고려하여 컴파일 시점에 결정되며, 지역변수의 초기화 이전 쓰레기 값은 이전에 pop된 스택프레임에 있었던 값입니다.
지역 변수와 스택 프레임
스택 프레임에는 지역 변수에 대한 정보가 들어간다 하였는데 이를 좀 더 자세히 살펴보겠습니다.
두개의 서로 다른 스택 프레임에 이름이 같은 지역변수 혹은 매개변수가 존재할 때 이들은 완전히 다른 변수이며, 활성 상태인 스택 프레임의 지역변수와 매개변수에만 접근할 수 있습니다. (즉 존재는 동시에 가능하나, 접근은 활성 상태의 스택 프레임 속 변수에만 가능합니다.)
Scope
https://ttl-blog.tistory.com/582
해당 포스팅에서 변수의 속성 중 scope(영역)라는 속성이 있다고 했었습니다.
Scope란 프로그램에서 해당 변수를 사용할 수 있는 영역을 의미합니다.
프로그램의 어떤 지점에서 사용할 수 있는 변수가 있으면, 변수는 그 지점에서 가시적(Visible)이라고 합니다.
Scoping 규칙
프로그램의 어떤 지점에서 사용된 변수 이름을 어디에서 선언된 변수와 대응시켜줄 것인지를 결정하는 규칙입니다.
중첩된 구조에서 Scoping 규칙
1. 변수 이름이 사용된 블럭(block)이나 함수에서 선언되어 있으면 그대로 사용합니다.
2. 선언이 없으면 둘러싸고 있는 블럭이나 함수로 이동해서 선언을 찾습니다. 있으면 그대로 사용합니다.
3. 선언이 없으면 또 다시 둘러싸고 있는 블럭이나 함수로 이동해서 선언을 찾습니다. 있으면 그대로 사용하는 과정을 반복합니다.
4. 전역변수 선언까지 도착했는데 해당 변수가 없으면 오류를 발생시킵니다.
Lifetime (존속기간)
Scope이 공간적인 개념이었다면, lifetime은 시간적인 개념입니다.
지역 변수
지역변수와 매개변수는 함수 호출시에 생성되었다가, 함수 종료시에 소멸됩니다.
지역변수(+ 매개변수)의 lifetime은 스택 프레임의 생성과 소멸에 따라 자동으로 수명이 결정되기 때문에 자동 변수라고 합니다.
대부분의 지역 변수가 자동 변수이기 때문에 auto 키워드를 생략합니다.
전역 변수
전역 변수의 경우에는 프로그램이 시작할 때부터 끝날 때까지 존재합니다.(static 변수는 프로그램 시작이 아닌 최초 호출시부터 존재합니다.)
지역 변수는 스택 프레임에 저장되고, 스택 프레임이 팝 되면 소멸합니다.
그러나 전역 변수는 Data Segment(데이터 세그먼트)라는 고정 메모리에 생성됩니다.
지역 변수는 스택 프레임에 남아 있던 쓰레기 값으로 초기화되지만, 전역 변수는 프로그램 시작과 함께 자동으로 0으로 초기화됩니다.
여러가지 변수의 Scope과 Lifetime
전역변수
Scope : 전체 프로그램
Lifetime : 프로그램 시작부터 끝까지
지역변수, 매개변수
Scope : 해당 함수
Lifetime : 해당 함수가 호출되어 실행될 때 부터, 리턴될 때까지
정적(static)변수
Scope : 지역변수와 동일
Lifetime : 해당 함수가 처음 호출되어 실행될 때부터 프로그램 끝날 때까지(전역변수와 유사.)
'c언어' 카테고리의 다른 글
[C언어] - 재귀함수 (0) | 2022.04.19 |
---|---|
[C언어] - register, volatile 키워드 (0) | 2022.04.19 |
[C언어] - 지역변수, 전역변수, static 변수 (0) | 2022.04.19 |
[C언어] - 함수 (0) | 2022.04.19 |
[C언어] - 조건문, 반복문 (0) | 2022.04.19 |