2020. 3. 19. 14:32ㆍ공부/전공
C언어의 메모리 구조 정리
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다.
프로그램을 실행시키면 운영체제는 메모리 공간을 할당한다.
할당 시기 : 프로그램이 실행 될 때 마다
할당 장소 : 메인 메모리 (RAM)
할당 용도 : 프로그램 실행 시 필요한 메모리 공간 (지역변수, 전역변수 선언을 위해) 할당
할당된 메모리 공간
Code
실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리
Data
프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
데이터(Data) 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸
Stack
함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
- 이렇게 스택 영역에서 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라 함
후입선출(LIFO,Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출
메모리 높은 주소에서 낮은 주소의 방향으로 할당
Heap
사용자(프로그래머)가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역
할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야하는 경우(런 타임 때) 유용하게 사용되는 공간
사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨
메모리 낮은 주소에서 높은 주소의 방향으로 할당
문제 예시
비정상적인 배열 선언 1
int i=0; scanf("%d",&i); int arr[i];
스택 영역에 할당될 메모리 크기는 컴파일 타임 결정된다.
i의 크기가 4바이트인 것은 알 수 있지만, arr이라는 배열의 크기는 알 수 없다.
비정상적인 배열 선언 2
int i=10; int arr[i];
컴파일 하는 동안 i가 4바이트의 크기라는 것을 알 수 있지만, 그 값이 10으로 초기화 되었다는 사실은 무시하고 넘어간다.
값이 10으로 초기화 되었다는 사실은 런 타임에 결정 된다.
따라서, 컴파일러는 arr의 크기가 40바이트가 된다는 사실을 알 수 없다.