동적 메모리 할당

제이미명언·2024년 2월 15일
post-thumbnail

동적 메모리 할당은 프로그램이 실행되는 동안에 필요한 메모리를 할당하고 해제하는 프로세스를 의미한다.

C언어에서는 'malloc()', 'calloc()', 'realloc()'을 사용하여 동적 메모리 할당할 수 있고, 필수적으로 free()로 메모리할당 해제를 해줘야 한다.

malloc()

  • 'void *malloc(size_t size)' 형식으로 선언되어 있다.
  • malloc 함수는 메모리 할당을 위해 사용된다. 인자로 전달된 크기만큼의 메모리를 할당하고, 할당된 메모리의 시작 주소를 반환한다.
  • 할당된 메모리는 초기화되지 않으며, 할당된 메모리에 이전에 사용되었던 데이터가 남아있을 수 있다.
  • 메모리 할당에 실패한 경우 'NULL'을 반환한다.

calloc()

  • 'void *calloc(size_t num, size_t size)' 형식으로 선언되어 있다.
  • calloc함수는 메모리를 할당하고 초기화하기 위해 사용된다. 인자로 전달된 'num'개수와 'size'크기의 요소를 가지는 배열을 할당하고, 모든 요소를 0으로 초기화한다.

※ calloc에서 '(int)calloc(10, sizeof(int));'는 malloc에서 '(int)malloc(sizeof(int)*10)'과 같은 의미다.

  • malloc과 달리 할당된 메모리는 0으로 초기화되기 때문에 사용하기 전에 초기화 할 필요가 없다.
  • 메모리 할당에 실패한 경우 'NULL'을 반환한다.

realloc()

  • 'void realloc(void ptr, size_t size)' 형식으로 선언되어 있습니다.
  • realloc 함수는 이미 할당된 메모리의 크기를 변경하기 위해 사용된다. 첫 번째 인자로는 기존에 할당된 메모리의 포인터를 전달하고, 두 번째 인자로는 새로운 크기를 전달한다.
  • realloc 함수는 기존에 할당된 메모리 블록의 크기를 새로운 크기로 변경한다. 이때, 이전에 할당된 데이터는 보존되며, 새로운 공간이 추가되거나 기존의 공간이 축소될 수 있다.
  • 기존 포인터가 'NULL'이면, malloc과 동일하게 동작하여 새로운 메모리를 할당한다.
  • 새로운 크기가 0이면 'free()' 함수와 동일하게 동작하여 기존에 할당된 메모리를 해제한다.
  • 메모리 할당에 실패한 경우 'NULL'을 반환하고 기존 메모리는 유지된다.

free()

  • 'free()' 함수는 할당된 메모리를 해제하고, 해당 메모리 블록은 다시 사용 가능한 상태가 된다.
  • 'free()' 함수는 NULL 포인터를 인자로 전달해도 아무런 작업을 수행하지 않는다. 따라서 free() 함수를 호출하기 전에 포인터가 NULL인지 여부를 검사해야한다.

sbrk()

메모리를 할당하게 되면 힙 영역에 메모리를 할당하게 되는데, 힙 영역은 그림과 같이 아래에서 위로 쌓이게 되며 힙 영역의 Top 부분은 'brk'라는 포인터가 가리키고 있다.

따라서 'brk'가 가리키고 있는 곳 까지 메모리를 할당하게 되면 더이상 할당 할 수 없게 되는데, 우리는 'sbrk()'라는 시스템콜을 통해 brk의 범위를 증가시킬 수 있다.

사용 예로, sbrk(0)은 현재 힙의 최상단 주소를 반환하고, sbrk(n)은 힙의 크기를 n만큼 늘리며, sbrk(-n)은 힙의 크기를 n만큼 줄인다.

메모리 할당/해제 과정

이번에는 동적 메모리 할당에 대해 알아보았고, 다음번에는 메모리 할당 방식인 Implecit Memory Allocator과 Explecit Memory Allocator에 대해 알아보겠다.

profile
c뿌리는 감자

2개의 댓글

comment-user-thumbnail
2024년 2월 22일

퍼가요~ ^^

1개의 답글