내일배움캠프 6일차 - C언어 동적할당 (면접질문에 나옴), typedef
메모리 레이아웃(메모리 구조)
메모리 레이아웃은 크게 스택 메모리, 힙 메모리, 코드 섹션, 데이터 섹션으로 나뉩니다.
이번 단원에서 살펴볼 메모리는 힙 메모리입니다.
코드 섹션과 데이터 섹션 (면접질문)
코드 섹션: 우리가 작성한 소스코드들이 빌드된 결과물들이 저장되는 곳입니다.
데이터 섹션: 전역 변수와 정적 변수등이 저장되는 곳입니다.
근데, 스택 메모리와 힙 메모리는 왜 나눴을까요?
스택 메모리의 단점
1. 스택 메모리에 저장되는 지역 변수(배열 등)의 크기는 컴파일 타임에 고정됩니다. 런타임에 더 필요해진다 해도 크기를 늘릴 수 없습니다.
2. 함수가 종료되면 해당 스택 프레임에 더이상 접근 불가능합니다. 즉, 지역변수의 수명은 함수의 수명과 함께합니다. 더 오래 보존하려면 전역변수 혹은 정적변수로 선언해야 합니다. 근데 이 변수들은 너무 또 극단적입니다. 프로그램의 수명과 함께합니다.
※ 런타임 시에 프로그래머가 원하는 만큼(1번 만족) 원하는 때에 생성 및 삭제(2번만족) 가능한 메모리가 필요합니다.
※ 스택 메모리 예시: int Nums[32];
힙 메모리(Heap Memory)
프로그래머의 메모리 할당과 해제를 통해 관리되는 동적 할당 영역입니다.
스택 메모리는 함수의 호출 및 종료에 따라 자동으로 정리됩니다만, 힙메모리는 아닙니다. 프로그래머가 원하는 만큼, 원하는 때에 할당 및 반납이 가능합니다. 이것이 힙 메모리의 장점입니다.
※ 힙메모리 예시: int* Nums;
힙 메모리의 단점
1) 스택 메모리에 비교해 할당/해제 속도가 느립니다. 스택 메모리는 자료구조 스택의 특성상 할당 및 해제에 O(1) 시간이 걸립니다. 힙 메모리는 할당 받아오려면 사용중이지 않은 메모리이면서 크기가 맞는지 체크 후 제공됩니다. 또한 메모리 공간에 구멍(메모리 단편화)이 생길 수도 있어서 효율적인 메모리 관리가 어렵기도 합니다.
2) 프로그래머가 직접 메모리 할당 및 해제 해야합니다. 메모리 할당만 하고 해제는 안하는 실수를 할 여지가 있습니다.
동적 할당의 세 가지 단계
1) 메모리 할당(대여)
- 힙 메모리 관리자에게 필요한 바이트만큼의 메모리를 달라고 요청합니다. 힙 메모리 관리자는 해당 크기의 연속된 메모리를 찾아서 반환합니다. 반환된 값은 시작 메모리 주소입니다.
할당: malloc() / calloc(), 재할당: realloc()
void* malloc(size_t size)
- memory allocation의 약자. stdlib.h 헤더파일에 선언되어 있습니다.
- size 바이트 만큼의 메모리를 반환해줍니다.
- 할당 실패시 NULL을 반환합니다.
2) 메모리 사용
- 할당된 힙 메모리 시작 주소를 가지고 원하는 작업 수행합니다. 이때 할당된 메모리 속 데이터는 쓰레기값입니다.
3) 메모리 해제(반납)
- 힙 메모리 관리자에게 해당 메모리 주소를 돌려주면서 다 썼다고 알립니다. 힙 메모리 관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꿉니다. 메모리 주소를 돌려주지 않으면 메모리 누수(Memory leak) 발생합니다. 메모리 누수란, 해당 메모리가 점유 상태를 벗어나지 못해 사용가능한 메모리가 줄어드는 현상입니다.
해제: free()
void free(void* ptr)
- 동적 할당 받은 메모리를 해제하는 함수.
- 다시말해, 메모리 할당 함수를 통해서 얻은 메모리 주소만 해제 가능합니다.
기타 동적 메모리 관련 변수(중요x) : memset() / memcpy() / memcmp() / …
댓글
댓글 쓰기