null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
메모리 레이아웃 (Memory Layout)
#c
#c-lang
#intermediate
#memory
#memory-layout
@devpc
|
2026-03-29 12:57:38
|
GET /api/v1/nodes/45?nv=2
History:
v2 (2026-03-29) (Latest)
v1 (2026-03-29)
0
Views
5
Calls
# 메모리 레이아웃 (Memory Layout) ## 프로세스의 메모리 구조 C 프로그램이 실행되면 OS는 프로세스에 메모리를 5개 영역으로 나누어 제공합니다. ``` 높은 주소 (예: 0xFFFFFFFF) ┌─────────────────────────┐ │ Stack (스택) │ ← 지역변수, 함수 인자, 반환 주소 │ ↓ │ 높은 주소 → 낮은 주소로 성장 │ │ │ (미사용 공간) │ │ │ │ ↑ │ │ Heap (힙) │ ← malloc/calloc으로 동적 할당 ├─────────────────────────┤ 낮은 주소 → 높은 주소로 성장 │ BSS Segment │ ← 초기화되지 않은 전역/정적 변수 ├─────────────────────────┤ │ Data Segment │ ← 초기화된 전역/정적 변수 ├─────────────────────────┤ │ Text Segment │ ← 컴파일된 기계어 코드 (read-only) └─────────────────────────┘ 낮은 주소 (예: 0x00000000) ``` --- ## 각 영역 상세 설명 ### 1. Text Segment (코드 영역) - 컴파일된 **기계어 명령어** 저장 - **읽기 전용 (read-only)** — 프로그램 실행 중 변경 불가 - 여러 프로세스가 공유 가능 (공유 라이브러리 등) ```c int add(int a, int b) { return a + b; } // 이 코드가 text에 저장됨 ``` ### 2. Data Segment (데이터 영역) - **초기화된** 전역 변수와 `static` 변수 저장 - 프로그램 시작 시 할당, 종료 시 해제 ```c int global = 100; // Data Segment static int s_val = 42; // Data Segment const char *str = "hello"; // 문자열 리터럴은 Text에, 포인터는 Data에 ``` ### 3. BSS Segment - **초기화되지 않은** (또는 0으로 초기화된) 전역/정적 변수 - 실행 파일에 실제 값을 저장하지 않고 크기만 기록 (파일 크기 절약) ```c int uninit_global; // BSS — 자동으로 0 초기화 static int s_zero = 0; // BSS ``` ### 4. Heap (힙) - `malloc`, `calloc`, `realloc`으로 동적 할당 - 낮은 주소에서 높은 주소 방향으로 성장 - `free`로 명시적 해제 필요 ```c char *buf = malloc(256); // Heap에 256바이트 할당 free(buf); ``` ### 5. Stack (스택) - 함수 호출 시 **스택 프레임** 자동 생성 - 높은 주소에서 낮은 주소 방향으로 성장 - 지역 변수, 함수 인자, 반환 주소 저장 ```c void func(int x) { // x: 스택 int local = 10; // local: 스택 char buf[64]; // buf[64]: 스택 (64바이트) } ``` --- ## 코드로 각 영역 확인하기 ```c #include <stdio.h> #include <stdlib.h> int global_init = 1; // Data int global_uninit; // BSS static int s_var = 2; // Data int main(void) { int local = 3; // Stack int *heap_var = malloc(sizeof(int)); // Heap *heap_var = 4; printf("Text (main): %p\n", (void*)main); printf("Data (global_init): %p\n", (void*)&global_init); printf("BSS (global_un): %p\n", (void*)&global_uninit); printf("Heap (heap_var): %p\n", (void*)heap_var); printf("Stack (local): %p\n", (void*)&local); free(heap_var); return 0; } ``` **출력 예시 (주소는 실행마다 다를 수 있음):** ``` Text (main): 0x401040 Data (global_init): 0x404010 BSS (global_un): 0x404020 Heap (heap_var): 0x1a4d260 Stack (local): 0x7ffd3b2c1a4c ``` --- ## 변수 위치 요약표 | 변수 종류 | 저장 위치 | 초기값 | 생명주기 | |----------|----------|--------|---------| | 전역 변수 (초기화 O) | Data | 지정값 | 프로그램 전체 | | 전역 변수 (초기화 X) | BSS | 0 | 프로그램 전체 | | static 지역 변수 | Data/BSS | 0 또는 지정값 | 프로그램 전체 | | 지역 변수 | Stack | 쓰레기값 | 함수 범위 | | 동적 할당 | Heap | 쓰레기값(malloc) | 명시적 free까지 | | 문자열 리터럴 | Text | — | 프로그램 전체 | --- ## 정리 | 영역 | 내용 | 관리 | |------|------|------| | Text | 실행 코드 | OS (read-only) | | Data | 초기화된 전역/정적 | OS | | BSS | 미초기화 전역/정적 | OS (0으로 채움) | | Heap | 동적 할당 | 개발자 (malloc/free) | | Stack | 지역 변수, 호출 정보 | 컴파일러/CPU | ---
// COMMENTS
ON THIS PAGE