이전에 동적 할당을 통해, 직접 메모리를 할당하고 해제해봤어요. 그렇다면, 우리가 쓴 코드 전체에서, 각 변수들이 선언되고 할당될 때 메모리는 어떻게 되는지, 함수는 어떻게 호출되서 어떻게 이전 코드로 되돌아가는지 등이 궁금하지 않나요? 이번에는 C 프로그램의 메모리 구조에 대해 이야기해볼게요.
실행 파일에 저장되는 요소는 아래와 같아요.
초기화되지 않은 것에 대해서는 이름과 크기만 저장해요.
스택 영역과 힙 영역의 경우, 코드가 실행되면서 메모리를 얼마나 차지할 지 알 수 없기 때문에 크기가 고정되어 있지 않아요. 스택은 메모리의 끝에서부터, 힙은 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;
}