본문 바로가기

기술면접/정리하기

메모리 공간 : 데이터(Data)영역, 힙(Heap)영역, 스택(Stack)영역

 

프로그램을 실행시키면 운영체제는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당해 준다.

할당되는 메모리 공간은 크게 데이터(Data), 힙(Heap), 스택(Stack) 영역으로 나눠진다.

 

 

할당 시기 : 프로그램이 실행될 때 마다

할당 장소 : 메인 메모리(RAM)

할당 용도 : 프로그램 실행 시 필요한 메모리 공간(지역변수, 전역변수 선언을 위해) 할당

 

 

 

1. 데이터(Data) 영역

: 전역 변수와 Static 변수가 할당되는 영역

프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸된다.

#include <stdio.h>
 
int a = 10;   //데이터 영역에 할당
int b = 20;   //데이터 영역에 할당
 
int main()
{
. . .
 
return 0;
}

위와 같은 코드에서 int형 변수 a, b는 프로그램 실행 시 main 함수가 호출되기 전에 데이터 영역에 할당된다.

그렇기 때문에 변수 a, b는 프로그램이 종료 될 때 까지 메모리상에 존재한다.

(전역변수가 프로그램이 종료될 때까지 존재하는 이유)

 

2. 스택(Stack) 영역

: 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역

함수 호출이 완료되면 사라진다.

#include <stdio.h>
 
void fct1(int);
void fct2(int);
 
int a = 10;         //데이터 영역에 할당
int b = 20;         //데이터 영역에 할당
 
int main()
{
   int i = 100;     //지역변수 i가 스택 영역에 할당
 
   fct1(i);
   fct2(i);
 
   return 0;
}
 
void fct1(int c)
{
   int d =30;        //매개변수 c와 지역변수 d가 스택 영역에 할당
}
//호출이 끝나면서 c와 d는 스택영역에서 삭제
 
 
void fct2(int e)
{
   int f = 40;       //매개변수 e와 지역변수 f가 스택 영역에 할당
}
//호출이 끝나면서 e과 f는 스택영역에서 삭제 
 
 

위의 코드를 이미지로 설명

 

3. 힙(Heap) 영역

: 필요에 의해 동적으로 메모리를 할당할 때 사용

할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우(런타임 때) 유용하게 사용되는 공간이다.

 

Q. 힙 영역은 왜 필요한 것 일까?

 

int main()
{
   //정상적인 배열선언
   int arr[10];
 
   //비정상적인 배열선언
   int i = 0;
   scanf("%d"&i);
   int arr[i];
 
   return 0;
}

우리는 배열을 선언할 때 상수로 선언을 한다.

배열의 길이를 사용자가 입력한 숫자로 잡아주는 것은 비정상적인 배열선언이다.

 

스탯 영역에 할당될 메모리의 크기는 컴파일 타임(컴파일하는 동안)에 결덩된다고 되어있다.

정상적인 배열 선언의 경우 arr이라는 배열의 크기가 40바이트라는 것을 알 수 있다.

하지만 비정상적인 배열 선언의 경우 i의 크기가 4바이트라는 것을 알 수는 있으나, arr이라는 배열의 크기는 알 수 없다.

 

int main()
{
   int i = 10;
   int arr[i];
 
   return 0;
}

그렇다면 위의 배열을 선언할 때, i라는 변수가 10이기 때문에 arr이라는 배열의 크기가 10이라는 것을 알 수 있을까?

결과는 아니다.

 

컴파일하는 동안 i가 4바이트의 크기라는 것을 알 수는 있으나, 그 값이 10으로 초기화되었다는 사실은 무시하고 넘어간다. 값이 10으로 초기화 되었다는 사실은 런타임(실행되는 동안)에 결정된다.

 

그렇기 때문에 컴파일러는 arr의 크기가 40바이트가 된다는 사실을 알 수 없다.

 

사용자의 요구에 맞게 메모리를 할당해 주기 위해서는 (런타임에 메모리 크기를 결정하고 싶을 때) 메모리 동적 할당을 통해 히힙 영역에 메모리를 할당해야 한다.

'기술면접 > 정리하기' 카테고리의 다른 글

객체 지향(OOP)  (0) 2019.05.14
자료구조와 알고리즘의 정의와 상관관계  (0) 2019.05.13
힙 메모리 최적화와 오브젝트 풀링  (1) 2019.05.10
큐 (Queue)  (0) 2019.05.09
스택 (Stack)  (0) 2019.05.09