지난 글에서 말했듯이 오늘은 stack의 구조에 대해서 같이 공부하는 시간이다!
stack에는 지역변수와 매개변수가 저장되게 되는데 스택 영역의 특징은 LIFO이다.(LAST IN FIRST OUT)
->마지막에 들어온값이 처음 나간다는 뜻인데 일상 속에서 예를 들어보자. 여러분들의 주방이 너무 더러워서 정리를 해보려고 한다. 특히 접시가 널브러져 있어서 한 곳에 쌓아두려고 한다. 차곡차곡 하나씩 접시를 쌓아놓았다. 맨 처음 정리 한 접시는 바닥에 깔려있을 것이고 마지막에 정리한 접시는 접시 더미의 맨 위에 위치해 있을 것이다. 만약 여러분이 접시가 필요해 접시를 쓰려고 할 때는 맨 위에 있는 접시를 사용하게 될 것이다. 즉 마지막에 정리한 접시를 가장 먼저 꺼내오게 되는 것이다. 여기서 접시를 쌓는 행위는 PUSH, 접시를 꺼내오는 행위는 POP라고 할 수 있다.
한번 다음 코드를 살펴보자

이 코드의 실행 순서는 어떻게 될까?
실행 순서는 다음과 같다.
1. main함수가 먼저 실행되고 int a, b, result가 선언됨.
2. a에 10, b에 20이 대입됨.
3. sum 함수가 실행됨.
4. 매개변수로 a엔 10 b엔 20이 전달됨.
5. sum함수에 변수 a엔 10, b엔 20이 대입됨.
6. sum함수의 a+b값이 반환되어 result에 대입됨.
7. main에서 0을 반환하고 코드 종료.
방금 위와같은 코드가 stack영역에서 어떻게 되는지 살펴보자.
1. main함수가 먼저 실행되고 int a, b, result가 선언됨.
변수명 | 값 |
result | 쓰레기 값 |
b | 쓰레기 값 |
a | 쓰레기 값 |
2. a에 10, b에 20이 대입됨.
변수명 | 값 |
result | 쓰레기 값 |
b | 20 |
a | 10 |
3. sum 함수가 실행됨.
4. 매개변수로 a엔 10b엔 20이 전달됨.
5. sum함수에 변수 a엔 10, b엔 20이 대입됨.
*함수에서 매개변수는 뒤에서부터 읽어오기 때문에 스택 영역에 b가 먼저 쌓이게 됨
변수명 | 값 |
a | 10 |
b | 20 |
result | 쓰레기 값 |
b | 20 |
a | 10 |
6. sum함수의 a+b값이 반환되어 result에 대입됨.
sum함수가 종료되었기 떄문에 pop 되어 stack 영역에서 변수 a와 b가 사라짐.
변수명 | 값 |
result | 30 |
b | 20 |
a | 10 |
7. main에서 0을 반환하고 코드 종료.
main함수에서 쓰던 변수들 사라짐.
변수명 | 값 |
이와 같이 프로그램이 작동한다. 위와 같이 stack 은 LIFO의 형태를 갖추고 있다.
다음 글에서는 메모리 구조의 data부분에 대해서 알아보자!
끗
#참고자료 https://m.blog.naver.com/pk3152/221555883362박원영님의 블로그
'C' 카테고리의 다른 글
20201130#(11) 메모리구조 (3) (heap) 동적할당(1) (0) | 2020.11.30 |
---|---|
20201103#(8) 지역변수와 메모리 구조? (0) | 2020.11.03 |
20201101#(7) 메모리구조 (3) (전역변수,static) (0) | 2020.11.01 |
20201026#(4) 메모리구조 (1) (0) | 2020.10.26 |