운영체제는 프로세스에 적절한 메모리를 할당하는데, 다음 구조를 기반으로 할당합니다.
위에서부터 스택(stack), 힙(heap), 데이터 영역(BSS segment, Data segment), 코드 영역(code segment)으로 나누어집니다. 스택은 위 주소부터 할당되고 힙은 아래 주소부터 할당됩니다.
스택
스택에는 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 ‘동적’인 특징을 갖습니다.
호출된 함수의 수행을 마치고 복귀할 주소 및 데이터 (지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 공간.
함수 호출시 기록하고 종료되면 제거한다.
스택 영역은 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데 이때 힙과 스택의 메모리 영역이 겹치면 안 되기 때문에 힙과 스택 사이의 공간을 비워 놓습니다.
힙
프로그래머가 필요할 때마다 사용하는 메모리 영역.
힙은 런타임 시 크기가 결정되며, ‘동적’인 특징을 가집니다.
데이터 배열의 크기가 확실하지 않고 변동이 있을 때 Heap 영역을 활용해서 메모리를 할당한다. 단 사용하고 난 다음에는 반드시 해제를 해야 한다. 안그러면 memory leak이 발생한다.

데이터 영역
데이터 영역은 전역변수, 정적변수가 저장되고, 정적인 특징을 갖는, 프로그램이 종료되면 사라지는 변수가 들어 있는 영역입니다.
데이터 영역은 BSS 영역과 Data 영역으로 나뉘고, BSS 영역은 초기화가 되지 않은 변수가 0으로 초기화되어 저장되며 Dagta 영역(Data segment)은 0이 아닌 다른 값으로 할당된 변수들이 저장됩니다.
코드 영역
코드 영역은 프로그램에 내장되어 있는 소스 코드가 들어가는 영역입니다. 이 영역은 수정 불가능한 기계어로 저장되어 있으며 정적인 특징을 가집니다.