프로그램은 크게 보면 code
와 data
로 구성된다.
좀더 세분화 하면 code,data,heap,stack
으로 볼 수 있다.

- code(text): read only, code 자체를 구성하는 명령이나 기계어 명령 존재. 이곳에 데이터를 쓰려고 하면 access violation을 발생 시킨다. cpu가 읽어 들여 수행한다고 해서 text라고 부른다.
- Data: global 변수, static 변수, 초기화된 배열과 그 구조를 저장
프로그램이 실행될때 생성되고, 프로그램이 종료되면 시스템에 반환
compile 할때 결정된다.
- heap: 동적으로 할당되는 메모리 위치. java나 C++에서 new 혹은 c에서 malloc으로 할당. c,c++은 해제를 해줘야 하고, java에서는 GC(Garbage Collector)가 자동으로 해제시켜줌
run-time시 결정된다.
- stack: local 변수 및 parameter, return address등이 저장되어 있는곳.
함수 호출시에 stack 영역에 생성되고 사용된 후 시스템에 반환.
함수로 인수를 보낼때는 역순으로 보낸다. 따라서 first in last out 형태가 된다.
stack은 상위메모리부터 할당되고, 나머지는 하위 메모리부터 할당된다.
code,data,stack 영역은 compile 할때 data 영역및 stack 영역의 크기를 계산해서 필요한 메모리 공간의 정보를 파일로 갖게 된다.
예로, int a[i]; 이런식으로 선언할수가 없다. compile 단계에서 배열의 메모리를 얼마나 확보해야 하는지 알아야 하는데 알 수 없기 때문이다.
parameter는 size를 알려주지 않아도 포인터로 변환 되므로 사용 가능한다.