
이 글에서는 메모리 구조에 대해 알아보도록 하겠습니다.
프로그램이 실행될 때 메모리가 어떻게 나누어지는지, 그리고 각 영역이 어떤 역할을 하는지 알아보도록 하겠습니다.
프로그램은 실행 될때 운영체제로 부터 메모리 공간을 할당 받습니다. 그리고 이 메모리는 크게 4가지로 나뉩니다

프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역입니다. 한마디로 명령문들이 저장되는 것인데, 제어문, 함수, 상수들이 이 영역에 저장됩니다.
CPU가 이 영역의 코드를 하나씩 읽어 실행합니다.
쉽게 말해 코드가 실행되기 위해 저장되어있는 영역입니다.
int main() {} 함수의 컴파일 결과도 여기 저장됩니다.데이터 영역은 우리가 작성한 코드에서 전역변수, 정적변수 등이 저장되는 공간입니다.
또한 데이터영역은 크게 두가지로 나뉩니다.
int a = 10; // 초기값 있음
static int count; // 초기값 없음
사용자에 의해 관리되는 영역입니다. 흔히 동적으로 할당 할 변수들이 여기에 저장된다고 보시면 됩니다.
필요할 때 메모리를 요청하고, 사용이 끝나면 다시 해제해야 합니다.
int* p = malloc(sizeof(int) * 10);
자바스크립트 객체/배열도 대부분 힙에 저장
예)
const obj = { name: "강현" }; // 객체는 힙에 저장
new String("Hello"); // 힙에 저장
스택 영역은 함수를 호출 할 때 지역변수와 매개변수가 저장되는 공간입니다. stack pop 과 같이 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해제시킵니다.
void test() {
int x = 3; // 스택에 저장
}
그래서 아래와 같은 코드는 스택 오버플로우를 일으킵니다:
int arr[10000000]; // 너무 큰 배열 → 스택 오버플로우
이번 글에서는 프로그램이 실행될 때 메모리가 어떻게 나뉘는지 간단하게 정리해보았습니다.
처음 봤을때는 생각 보다 쉬워 보였지만 자료를 찾다 보니 생각 보다 깊은 내용도 많고 많이 어려워서 내용 보완 할 점이 많다고 생각 합니다.
글 읽어 주셔서 감사합니다