c 동적할당 malloc & calloc & realloc & free
동적할당 dynamic allocations
- 프로그램이 실행되는 동안 사용할 메모리 공간을 동적으로 할당하는 것을 의미한다
- 사용이 끝나면 반납하고, 재 할당 받을 수도 있다
- 내가 얼만큼의 공간이 필요한지 모를 때, 동적할당을 하지않고 정적할당으로 넉넉하게 큰 공간을 고정해버리면, 메모리의 낭비가 생기거나, 할당된 공간이 부족한 경우들이 생기기 때문에 동적할당을 사용한다
- 메모리를 할당하고 사용이 끝났음에도
free()
로 해제를 하지 않으면 메모리 누수가 발생한다
힙(heap) 영역
- 원시 자료형이 아닌 보다 큰 크기의 데이터를 담고자 동적으로 할당하는 메모리 공간을 지칭
- 메모리 할당을 요청하면 힙 공간안에서 사용하능한 곳을 찾아 그곳을 다른 스레드나 프로그램이 사용하지 못하도록 예약 상태로 만들고, 접근가능한 포인터를 반환하는 형식으로 사용한다
- C 언어의 메모리 구조
안에 아래와 같은 함수들이 정의되어 있다
!! 만약 저장할 메모리 공간이 부족하게 되면, 할당이 실패하고 NULL 포인터를 반환한다 !!
malloc(size_t size) | size 바이트의 메모리를 힙에서 할당하여 포인터값을 반환 |
calloc(size_t num, size_t size) | (num*size) 바이트의 메모리를 힙에서 할당하고 포인터 값을 반환 |
realloc(void*ptr, size_t size) | ptr이 가리키는 메모리를 size 바이트 만큼 힙에서 재할당하여 반환 |
free(void*ptr) | ptr이 가리키는 메모리를 해제 필요없는 메모리는 꼭! 해제 해야함 |
malloc() & calloc() - 영역 할당
1) malloc()
-
memory allocation
-
단일의 큰 메모리 영역(a single large block)에 특정한 크기의 영역을 할당하고 싶을 때 사용한다
-
void 형의 포인터를 반환하는데, 어떤 형태의 포인터로 사용 가능하다
ptr = (cast-type*) malloc (byte-size);
# byte-size 크기만큼의 공간이 ptr 에 할당된다
int* ptr = (int*) malloc (100*sizeof(int));
# int는 보통 4byte지만 할당할 때 100*4 라고 하지 않는다
# 왜냐하면 운영체제나 하드웨어, 컴파일러에 따라 달라질 가능성이 있기 때문이다!
# ex) 32비트와 64비트 플랫폼에 따라 주소의 크기가 달라짐
2) calloc()
- contiguous allocation (연속적인 할당)
- 하나의 영역을 할당했던 malloc() 과 달리, 여러 개의 영역을 할당할 수 있다
- 각각의 영역들은 defalut 값으로 0 을 가진다 (0으로 초기화)
ptr = (cast-type*) calloc (n, element-size);
# n : 할당할 영역의 개수
int* ptr = (int*) calloc (25, sizeof(int));
# 각각 sizeof(int)크기를 가진 연속적인 25개의 공간을 할당한다
# 전체 크기는 25 * sizeof(int)
realloc() - 재 할당
- re-allocation
- 이전에 할당한 메모리 영역이 부족하다면, realloc() 을 사용해 재할당 하여 영역을 확장할 수 있다 (dynamically re-allocate memory)
ptr = realloc (ptr,newSize);
# 뒤에 추가로 newSize가 붙는게 아니라, 전체 크기가 newSize로 변하는 것!
int* ptr = (int*) malloc (5*sizeof(int));
ptr = realloc (ptr, 10*sizeof(int));
# 5*sizeof(int) --> 10*sizeof(int)
# 원래 있던 5*sizeof(int) + 10*sizeof(int) 가 아니라 전체 크기가 5*sizeof(int) 에서 10*sizeof(int)로 재할당 된다
free() - 영역 해제
- de-allocate
malloc()
이나calloc()
으로 할당된 메모리 영역의 사용이 끝났다면, free()로 할당을 해제해야 한다!
free(ptr);
참고
Comments