메모리 구조
프로그램은 실행하면 운영체제에 의해 관리되는 메인 메모리(RAM)의 일부를 할당받아 사용하게 됩니다.
프로그래머가 생성한 변수들은 코드에 따라 할당받은 메모리 이곳저곳에 저장합니다.

메모리의 구조는 Stack, Heap, Data , Text(Code)
Text : 기계어 형태로 실행할 코드가 저장되어 있는 영역
Data : 전역변수, Static 변수들이 저장되는 영역
Stack : 지역변수와 매개변수가 할당되고 함수를 빠져나가면 소멸
Heap : 프로그램 실행 중 할당되는 메모리 영역으로 프로그래머에 의해 할당(CPP(new), C(malloc))
Code
프로그래머가 작성한 소스코드가 저장되는 영역으로 기계어 형태로 저장됩니다.
CPU는 Code영역에 저장된 명령어들을 하나씩 가져가서 실행합니다.
Read-Only이기 때문에 수정이 불가능합니다.
Data
전역 변수와 Static 변수가 할당됩니다.
main함수 전에 선언되어 프로그램의 시작과 동시에 할당되고 프로그램이 종료 되어야 메모리에서 소멸됩니다.
uninitialized data가 저장되는 BSS영역과 initialized data가 저장되는 Data 영역으로 구분지을 수 있습니다.
Stack
먼저 들어간건 나중에 나오는 LIFO의 구조로 되어있습니다.
메모리의 높은 주소부터 낮은 주소 순으로 할당됩니다.
할당과 해제를 반복하기 때문에 데이터 용량이 불확실합니다.
컴파일 시 할당될 영역의 크기가 결정되며 크기에 제한이 있어 정해진 크기를 넘어 할당할 수 없습니다.
이미 할당된 공간에 포인터 위치만 바꿔주는 작업이기 때문에 속도가 빠릅니다.
Heap
프로그래머가 할당하고 해제해주는 영역입니다.
C의 malloc, free C++의 new,delete 등 할당해제 기능이 필요합니다.
런타임 시 Heap영역의 크기가 결정되기 때문에 데이터 크기가 확실하지 않을 때 사용합니다.
낮은 주소에서 높은 주소 순으로 할당됩니다.
스택보다 할당할 수 있는 메모리 공간이 많다는 것이 장점입니다.
데이터를 읽고 쓰기가 느립니다.
메모리를 해제 해주지 않으면 memory leak 가 발생합니다.
Java, C#은 GC가 수거합니다.
Stack과 Heap
Stack과 Heap은 같은 메모리 영역을 사용하기 때문에 Stack의 영역이 클수록 Heap의 영역이 작아지고
반대로 Heap의 영역이 클수록 Stack의 영역이 작아집니다.
서로의 영역을 상대의 영역을 침범할 수 있습니다.
Stack overflow : Stack영역에 저장할 수 있는 데이터의 양을 초과하여 데이터를 삽입하려고 할 때 발생하는 오류입니다. 매우 큰 지역변수를 선언하거나 재귀 호출이 너무 많아 지면 발생합니다.
Heap overflow : 프로그램이 실행되는동안 메모리를 할당하고 해제하지만 이 힙 메모리가 완전히 소진될 때 발생합니다. 실제 시스템에서는 운영 체제가 메모리 관리를 담당하고 있으므로 힙메모리가 부족해지면 운영 체제가 추가 메모리를 제공하거나 프로그램에 메모리 부족 상태를 알리는 등의 방식으로 대응하기 때문에 힙 오버플로우는 거의 발생하지 않습니다.