-
스택(stack)과 힙(heap) 메모리cs 2023. 6. 18. 19:16
메모리의 구조
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간에는 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역이 있다.
메모리 공간(출처. TCP School) - 코드(code) 영역(= 텍스트 영역)
실행할 프로그램의 코드가 저장되는 영역. CPU가 명령어를 처리함. - 데이터(data) 영역
프로그램의 전역변수, 정적변수가 저장되는 영역. 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함. - 스택(stack) 영역
지역변수, 매개변수가 저장되는 영역. 운영체제에 의해 관리됨.
함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함. 함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역변수 등이 저장됨.
후입선출(Last-In First-Out) 방식에 따라 동작하므로 가장 늦게 저장된 데이터가 가장 먼저 인출됨.(메모리의 높은 주소 → 낮은주소 방향으로 할당)
스택 프레임(stack frame)
: 스택 영역에 저장되는 함수의 호출정보.(매개변수, 반환 주소값, 지역변수 등)
스택 오버플로우(stack overflow)
: 함수의 재귀호출이 무한히 반복되면, 스택 오버플로우에 의해 종료됨. 스택의 모든 공간을 차지하여 여유 공간이 없을 때, 또 다시 스택 프레임을 저장하면 해당 데이터는 스택영역을 넘어 저장하게 됨. 때문에 C언어는 스택오버플로우가 발생하면 에러를 발생시켜 강제 종료시킴.- 힙(Heap) 영역
메모리 공간이 동적으로 할당되고 해제됨. 사용자에 의해 관리되며 필요에 따라 확장 또는 축소됨. 선입선출방식(낮은주소 → 높은주소 방향으로 할당됨.)
동적 메모리 할당(dynamic allocation)
프로그램이 실행되는 도중인 런 타임에 사용자가 직접 결정한 메모리를 할당받음.(데이터, 스택영역은 컴파일 타임에 메모리 크기가 결정됨)
- malloc()함수: 힙 영역에 메모리를 동적으로 할당
- free()함수: 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환. 메모리 누수 방지.
- calloc()함수: 힙 영역에 메모리를 동적으로 할당. 메모리의 크기를 두 개의 인수로 나누어 전달받음. 메모리 할당 후 모든 비트값을 전부 0으로 초기화 해줌.
- realloc()함수: 이미 할당된 메모리의 크기를 바꾸어 재할당.
#include <stdlib.h> //void *realloc(크기를 바꾸려는 메모리 공간을 가리키는 포인터, 재할당 크기); void *realloc(void *ptr, size_t size);
스택(stack)과 힙(heap) 장점
스택의 장점
- 빠른 액세스
- 변수를 명시적으로 할당, 해제 할 필요가 없음
- 메모리 공간은 운영체제에 의해 효율적으로 관리됨
- 스택 크기 제한(*스택오버플로우)
힙의 장점
- (상대적으로)느린 액세스
- 변수 전역적으로 사용가능
- 메모리 크기 제한 없음
- 사용자가 메모리 공간을 관리함(메모리공간을 효율적으로 관리하지 못하면 메모리 부족, 누수 등의 문제가 발생할 수 있음)
- 코드(code) 영역(= 텍스트 영역)