내일배움캠프 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을 반환합니다.

void* realloc(void* ptr, size_t new_size)
 - 이미 동적할당 받은 메모리 시작 주소 ptr을 new_size 바이트로 재할당 해주는 함수.
 - 새로운 크기가 허용하는 한 기존 데이터를 그대로 유지해줍니다.

2) 메모리 사용

 - 할당된 힙 메모리 시작 주소를 가지고 원하는 작업 수행합니다. 이때 할당된 메모리 속 데이터는 쓰레기값입니다.

3) 메모리 해제(반납)

 - 힙 메모리 관리자에게 해당 메모리 주소를 돌려주면서 다 썼다고 알립니다. 힙 메모리 관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꿉니다. 메모리 주소를 돌려주지 않으면 메모리 누수(Memory leak) 발생합니다. 메모리 누수란, 해당 메모리가 점유 상태를 벗어나지 못해 사용가능한 메모리가 줄어드는 현상입니다.

해제: free()

void free(void* ptr)
 - 동적 할당 받은 메모리를 해제하는 함수.
 - 다시말해, 메모리 할당 함수를 통해서 얻은 메모리 주소만 해제 가능합니다.

※ malloc()을 작성했다면 곧바로 free()부터 작성하기.
동적 할당 받은 메모리 주소를 지역 변수에 저장해뒀다가 해제 안하고 함수가 종료되버리면,
해당 지역변수를 접근할 방법이 사라져 버립니다. 지울 방법이 없습니다.
이렇게 반납하지 않으면 메모리 누수가 발생하므로, 무슨 일이 있어도 free()부터 작성합시다.

기타 동적 메모리 관련 변수(중요x) : memset() / memcpy() / memcmp() / …


구조체도 기본 자료형처럼 쓰고 싶습니다.

변수를 선언 할 때, struct 키워드를 빼고 자료형만 적고 싶은데 어떻게 해야 할까요?

typedef

type definition의 약자. 이미 정의되어 있는 자료형에 새로운 별명을 지어줍니다.
ex) 선생님을 쌤, …

size_t 자료형도 사실 typedef unsigned long long size_t
_t가 접미사로 붙으면 typedef 되었다고 보면 됩니다.


댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁