이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[C] 스택 프레임

  • 2022.03.22 12:49
  • Programming Language/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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (606)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (69)
      • Operating System (18)
      • Computer Network (17)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (13)
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바