c 동적할당 malloc & calloc & realloc & free

1 minute read

동적할당 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);

참고

Categories:

Updated:

Comments