▸C언어/기본 상식

C언어의 메모리_기본 구조 [1/2]

코데방 2019. 12. 5.
728x90

C언어의 메모리 구조를 살펴보겠습니다. 디테일하지 않게 추상화하여 정리했습니다.

 


 

먼저 C언어에서 사용하는 메모리의 구조 입니다. 사실 다른 언어들도 같은 구조를 사용하지만 사용하는 방법이나 각 segment를 사용하는 용도가 조금씩 다릅니다.

 

 

 


 

1. 코드 영역 (Code Segment)

먼저 프로그램이 실행되면 프로그램의 실행 명령어인 바이너리 코드가 코드 영역에 저장됩니다. 코드 자체에 포함된 문자열이나 상수 또한 프로그램 실행 시 절대 변경되면 안되기 때문에 코드 영역에 저장됩니다.

  • 텍스트 영역( (Text Segment)이라고도 함
  • 컴파일되어 바이너리 코드(기계어) 형태로 저장된 영역
  • 코드에 직접적으로 적혀있는 문자열(String)과 상수 또한 코드 영역에 저장됨
  • 프로그램 실행 시 절대 변경되면 안되는 데이터를 저장 (코드, 상수, 코드 내 문자열 등)

 

 


 

2. 데이터 영역 (Data Segment)

데이터 영역은 전역변수와 같이 일회성이 아닌 프로그램이 실행되지 않는 동안 사라지지 않는 변수 공간을 할당하고 값을 저장합니다. 또한 코드 내에 포함된 문자열의 경우 코드 영역에 저장되고 그 위치값만 데이터 영역에서 가지고 있기 때문에, 코드 내에 아무리 많은 동일 문자열을 쓰더라도 실제로는 하나의 문자열만 메모리 내에 존재하게 됩니다. 이부분은 컴파일러가 알아서 처리해줍니다.

  • 프로그램이 실행될 때 할당되고, 종료될 때 해제되어야 하는 변수를 저장
  • 전역변수, 정적(Static)변수 등을 저장
  • 만약 문자열 변수가 초기화된 문자열이라면, 문자열 자체는 Data Sement에 저장됨
  • 데이터의 변경이 가능한 영역

 

 


 

3. 힙 영역 (Heap Segment)

간단히 우리가 동적할당이라고 부르는 malloc을 할 때 할당받았다가 free시키면 해제되는 공간입니다. Java같은 언어에서는 개발자가 직접적으로 이 영역을 사용하지 않고 프로그램이 알아서 사용합니다. 하지만 C언어의 경우에는 특히 메모리 관리에 대한 자유도가 높아 개발자가 메모리를 할당했다 해제해주는 일이 많습니다. 이를 위한 공간입니다.

  • 개발자에 의한 동적 할당
  • 프로그램 실행(Runtime) 도중 개발자가 미리 정해둔 의도에 의해 생성됐다 해제되는 영역

 


 

4. 스택 영역 (Stack Segment)

흔히 후입선출(LIFO - List in First Out)의 구조를 표현할 때 스택 구조라고 부르는데 이 때 나오는 스택이 이 영역의 이름에서 유래됐다고 합니다. 개발자가 직접 다루는 공간은 아니지만 가장 잘 알아야 하는 공간이라고 생각합니다. 함수를 보다 효율적으로 실행하기 위해 생겨난 공간입니다.

  • 프로그램에 의한 동적 할당
  • 프로그램 실행(Runtime) 도중 함수 실행을 위해 임시로 생성됐다 해제되는 영역

 


 

다음 글에서는 스택 영역에 대해 조금 더 구체적으로 다뤄 보겠습니다.

728x90

'▸C언어 > 기본 상식' 카테고리의 다른 글

C언어의 메모리_스택 메모리 [2/2]  (0) 2019.12.05

댓글

💲 추천 글