C언어) C 프로그램의 메모리 구성

Lapis0875·2022년 12월 12일
0

c언어

목록 보기
21/21

📱 C 프로그램은 메모리를 어떻게 관리할까?

이전에 동적 할당을 통해, 직접 메모리를 할당하고 해제해봤어요. 그렇다면, 우리가 쓴 코드 전체에서, 각 변수들이 선언되고 할당될 때 메모리는 어떻게 되는지, 함수는 어떻게 호출되서 어떻게 이전 코드로 되돌아가는지 등이 궁금하지 않나요? 이번에는 C 프로그램의 메모리 구조에 대해 이야기해볼게요.

C 프로그램의 메모리 구조

C 프로그램의 메모리 구조에 대한 그림이다. 상위 메모리에서부터, 순서대로 스택 -> 힙 -> BSS -> 데이터 -> 텍스트 순으로 배치되어 있다. 스택은 위에서 아래로, 힙은 아래에서 위로 확장된다.

  • 스택 : 함수의 지역 변수, 매개 변수, 리턴 주소를 저장.
  • 힙 : malloc(), calloc()으로 동적 할당할 때 사용되는 공간.
  • 텍스트 : 실행 코드가 저장. (컴파일 시 고정된 크기를 가져요. 쓰기 금지.)
  • 데이터 : 초기화 된 전역 변수, 정적 변수를 저장. (컴파일 시 고정된 크기를 가져요. 쓰기 가능해요)
  • BSS : 초기화 되지 않은 전역 변수, 정적 변수 저장. (0으로 초기화된 경우는 여기에 저장됩니다.) (컴파일 시 고정된 크기를 가져요. 쓰기 가능해요.)

실행 파일에 저장되는 요소는 아래와 같아요.

  • 텍스트
  • 데이터 (초기화된 전역 변수, 정적 변수)

초기화되지 않은 것에 대해서는 이름과 크기만 저장해요.

스택 영역과 힙 영역의 경우, 코드가 실행되면서 메모리를 얼마나 차지할 지 알 수 없기 때문에 크기가 고정되어 있지 않아요. 스택은 메모리의 끝에서부터, 힙은 BSS영역과의 경계선부터 천천히 확장해가게 돼요. (그림의 화살표)

각 요소가 저장되는 위치

double pi = 3.141592;	// 데이터 영역에 저장 (초기화된 전역 변수)
int r;		// BSS 영역에 저장 (초기화되지 않은 전역 변수)

double area(int);

int main(void)	// main 함수의 모든 문장은 텍스트 영역에 저장돼요.
{
	printf("원 반지름 길이 : ");
	scanf("%d", &r);
    printf("원 넓이 : %.2lf\n", area(r));
    return 0;
}

double area(int r)	// area 함수의 모든 문장은 텍스트 영역에 저장돼요.
{
	static int callCnt = 0;		// BSS 영역에 저장 (0으로 초기화된 정적 변수)
    return pi * r * r;
}
profile
새내기 대학생 개발자에요 :D

0개의 댓글