본문 바로가기
Language&Framework&Etc/C

메모리 관리와 메모리의 동적 할당(25-1) C언어의 메모리 구조

by 머리올리자 2020. 12. 17.

프로그램을 실행하면 해당 프로그램의 실행을 위한 메모리 공간이 운영체제에 의해서 미리 마련

 

그리고 이 메모리 공간 내에서 변수가 선언되고, 문자열이 선언

 

메모리의 구성

프로그램 실행 시 운영체제에 의해서 마련되는 메모리의 구조는 다음과 같이 네 개의 영역으로 구분

이렇게 메모리 공간을 나눠서 유사한 성향의 데이터를 묶어서 저장을 하면, 관리가 용이해지고 메모리의 접근속도가 향상.

 

서랍장의 수납공간이 나뉘어 있으면, 물건을 찾을 때 한결 수월하듯이 메모리 공간을 나누는 것이 좋음

 

메모리 영역별로 저장되는 데이터 유형

코드 영역(Code Area)

  • 이름 그대로 실행할 프로그램의 코드가 저장되는 메모리 공간이다.
  • 따라서 CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행

데이터 영역(Data Area)

  • 전역변수와 static으로 선언되는 static 변수가 할당
  • 이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리 공간에 할당되어 프로그램 종료 시까지 남아있게 된다는 특징이 있다.

스택 영역(Stack Area)

  • 지역변수와 매개변수가 할당
  • 이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리 공간에 할당되어 프로그램 종료 시까지 남아있게 된다는 특징이 있다.

힙 영역(Heap Area)

  • [데이터 영역]과 [스택 영역]에 할당되는 변수들은 생성과 소멸의 시점이 이미 결정되어 있다.
  • 그러나 프로그램을 구현하다 보면, 이 두 영역의 변수들과는 다른 성격의 변수가 필요하기도 하다.
  • 그래서 C언어에서는 프로그래머가 원하는 시점에 변수를 할당하고 또 소멸하도록 지원을 하는데 바로 이러한 유형의 변수들이 할당되는 영역임

프로그램의 실행에 따른 메모리의 상태 변화

main 함수가 호출되기 이전에 데이터 영역이 먼저 초기화된다.

 

전역변수가, 그리고 static 변수가 먼저 데이터 영역에 할당이 되고 나서 main 함수가 호출된다.

 

이어서 main 함수가 호출되고 main 함수 내에 선언된 num1이 스택에 할당되어 다음의 구조가 된다.

 

다음으로 main 함수 내에서 fct 함수가 호출된다.

때문에 fct 함수의 매개변수가 스택에 할당되고 fct 함수의 지역변수도 그 뒤를 이어서 할당

 

다음으로 fct가 반환을 하면서 fct 함수 호출 시 할당되었던 매개변수와 지역변수가 소멸되면서 다음의 형태

다시 fct 함수의 호출이 진행되고, 더불어 매개변수와 지역변수가 다시 스택에 할당되어 다음의 구조

마지막으로 fct 함수가 반환되고, main 함수의 return 문이 실행되면서 프로그램이 종료된다.

 

그리고 프로그램이 종료되면, 운영체제에 의해서 할당된 메모리 공간 전체를 반환하게 되는데, 바로 그때가 전역변수가 소멸되는 시점이다.

 

 

스택 영역의 특징

 

다음 순서로 함수가 호출되었다고 가정

 

main 함수의 호출 → fct1 함수의 호출 → fct2 함수의 호출

 

이는 fct1 함수가 반환된 이후에 fct2 함수가 호출된 것이 아니고, fct1 함수 내에서 fct2 함수가 호출되었다는 뜻.

 

그리고 이러한 경우 지역(매개)변수의 소멸순서는 다음과 같음

 

fct2의 지역변수 소멸 → fct1의 지역변수 소멸→ main의 지역변수 소멸

 

먼저 호출된 함수의 스택공간일수록 늦게 해제된다는 것을 알 수 있다.

 

그래서 메모리 영역의 이름이 스택이다.

 

스택(Stack)은 '쌓아 올려진 더미'를 뜻한다.

 

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.