Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 프로그램의 메모리 레이아웃: 스택, 힙, 텍스트, 데이터 세그먼트 완벽 이해

C 프로그램의 메모리 레이아웃 개요

C 프로그램이 실행될 때 사용하는 메모리는 하나의 덩어리가 아니라 목적에 따라 여러 개의 영역(세그먼트)으로 나뉘어 관리됩니다. 대표적인 메모리 영역은 다음과 같습니다.

  • 스택 세그먼트(Stack Segment)
  • 힙 세그먼트(Heap Segment)
  • 텍스트 세그먼트(Text Segment)
  • 데이터 세그먼트(Data Segment)

각 영역은 서로 다른 용도와 특성을 가지며, 프로그램의 안정성과 성능을 이해하려면 이 구조를 정확히 아는 것이 중요합니다.

각 메모리 영역의 역할과 특징

1. 스택(Stack)

스택 영역에는 함수의 매개변수, 반환 주소(return address), 지역 변수 같은 임시 데이터가 저장됩니다. 자동 변수(automatic variable)와 함수 인자를 위해 할당되는 공간으로, 함수 호출 시 다음에 실행할 주소, 즉 복귀 주소도 함께 기록합니다.

스택은 LIFO(Last-In-First-Out, 후입선출) 방식으로 동작하며, 지역 변수·함수 인자·복귀 주소를 순서대로 저장하고 해제합니다. 이 영역의 크기는 지역 변수의 개수, 함수 인자, 함수 호출 깊이에 따라 달라지며, 높은 주소에서 낮은 주소 방향으로 성장한다는 점이 특징입니다.

2. 힙(Heap)

힙은 프로그램 실행 중(run time)에 동적으로 할당되는 메모리 영역입니다. 대표적으로 malloc(), calloc() 같은 동적 메모리 할당 함수가 사용하는 공간이 바로 힙입니다. 사용자가 요청한 만큼 크기가 늘어나거나 줄어들 수 있으며, 낮은 주소에서 높은 주소 방향으로 성장합니다.

참고로 각 세그먼트(데이터, bss 등)의 실제 크기는 리눅스 환경에서 size 명령어를 실행해 확인할 수 있습니다.

3. 텍스트(Text)

텍스트 영역은 실행 파일의 .text 섹션에 해당하며, 프로그램의 명령어 코드(instruction code)가 저장되는 공간입니다. 현재 실행 중인 활동은 프로그램 카운터(Program Counter)의 값과 프로세서 레지스터의 내용으로 표현됩니다. 이 영역은 프로그램 실행 내내 변경되지 않는 고정된(fixed) 영역입니다.

4. 데이터(Data)

데이터 영역에는 전역 변수(global variable)와 정적 변수(static variable)가 저장되며, .data 섹션과 .bss 섹션으로 표현됩니다.

.data 섹션은 프로그램에서 사용할 데이터 요소가 저장되는 메모리 영역을 선언하는 데 사용됩니다. 데이터 요소가 선언된 이후에는 크기를 확장할 수 없으며, 프로그램 전체 실행 기간 동안 정적(static)으로 유지됩니다.

.bss 섹션 역시 정적 메모리 영역으로, 프로그램에서 나중에 선언될 데이터를 위한 버퍼를 담고 있습니다. 이 버퍼 메모리는 0으로 채워져(zero-filled) 초기화됩니다.

데이터 세그먼트의 세부 구분

데이터 세그먼트는 성격에 따라 두 부분으로 더 나눌 수 있습니다.

1. 초기화된 데이터 세그먼트(Initialized Data Segment)

초기값이 명시적으로 지정된 전역 변수와 정적 변수가 저장되는 영역입니다. 이 세그먼트는 읽기-쓰기(read-write)가 가능하여, 프로그램 실행 중에도 변수 값을 변경할 수 있습니다. 크기는 컴파일 시점에 결정되어 고정됩니다.

2. 초기화되지 않은 데이터 세그먼트(Uninitialized Data Segment, BSS)

초기화되지 않은 데이터 세그먼트는 흔히 BSS(Block Started by Symbol)라고 불립니다. 초기값 없이 선언된 정적 변수와 전역 변수가 이곳에 배치되며, 프로그램 시작 시 모두 0으로 자동 초기화됩니다. 실행 파일의 크기를 줄이는 데 도움이 되는 영역이기도 합니다.