malloc과 free

ROK·2022년 8월 5일
0

메모리의 동적 할당

메모리의 동적 할당이란 컴퓨터 프로그램이 실행되는 런타임 도중에 사용할 메모리 공간을 할당하는 것을 말한다.

동적 할당을 사용하는 이유는 코드를 작성할 때 메모리에 얼마가 필요한지 정확하게 알 수 없기 때문에 프로그램을 실행하는 도중에 필요한 만큼만 메모리를 할당해 메모리 낭비를 줄일 수 있다.

동적 할당되는 메모리는 힙 영역에 생성되고, 컴파일 타임에 메모리의 크기가 결정되는 데이터 영역이나 스택 영역의 정적 메모리 할당과는 대조적인 개념이다.

malloc 함수

malloc 함수를 사용하기 위해서는 <stdlib.h> 또는 <malloc.h> 헤더파일을 사용해야한다.

malloc 형식

#include <stdlib.h>

void * malloc(size_t size);

기본 형태는 void 반환형 포인터이다. void인 이유는 할당받은 메모리를 몇 바이트씩 잘라서 사용할지 모르기 때문에 필요에 따라 형변환을 해 사용할 수 있다.
매개변수에는 size_t를 통해 할당할 메모리의 크기를 넘겨준다

malloc 사용 예시

#include <stdio.h>
#include <stdlib.h>

int main() {
	char * c = (char*)malloc(1); // 1바이트 메모리 할당, (char*)를 사용해 강제 형변환
    *c = 'h';
    printf("%d, %c \n", c, *c);
    free(c); // 메모리 해제

위 예제는 1바이트의 메모리를 할당해서 char형 포인터에 할당한 주소값을 저장한다.

코드 동작 순서

  • malloc을 통해 HEAP 영역에 1바이트 메모리를 할당
  • 스택 영역에 선언한 지역변수 포인터 C가 malloc으로 할당한 주소를 가진다.
  • 해당 포인터를 malloc으로 할당한 메모리에 문자열 'h'를 저장

위 예제처럼 숫자로 메모리를 정해줬지만 보통 일반적으로는 sizeof를 사용해 할당할 변수의 크기와 그 변수의 개수를 직접 입력한다. malloc(sizeof(char));와 같이 선언

비슷하게 int형 변수 4개를 할당 받는 예제

int main() {
	int * arr = (int*)malloc(sizeof(int) * 4); // int 사이즈 4개 메모리 할당
    arr[0] = 100;
    arr[1] = 200;
    arr[2] = 300;
    arr[3] = 400;
    
    printf("%d %d %d %d \n", arr[0], arr[1], arr[2], arr[3]);
    free(arr);
}

위 코드를 보면 int 크기에 4를 곱한만큼의 크기를 할당받는다.
그리고 (int*)로 형변환을 시켜 arr의 인덱스는 각각 4바이트씩 차이가 난다.

코드 동작 순서

  • malloc을 통해 HEAP 영역에 4바이트씩 총 16바이트의 메모리를 할당
  • int형 포인트 변수 arr(그림에서는 i)가 시작 주소값을 가진다.
  • 각각 할당한 메모리에 배열의 인덱스로 값을 저장
  • arr[i] == *(arr + i)

추가 : 함수 형식

void * malloc(size_t size);
void * calloc(size_t nelem, sizeo_t elsize);
void * realloc(void * ptr, size_t size);
void free(void * ptr);

void * malloc(size_t size);

  • 할당받을 메모리 크기를 인자로 받음
  • 예시
    • int * arr = (int *)malloc(sizeof(int) * n);
    • 인자의 개수가 n개의 배열을 동적할당

void * calloc(size_t nelem, sizeo_t elsize);

  • 첫 번쨰 인자 배열요소 갯수, 두 번째 인자 각 배열요소 사이즈
  • 할당된 메모리 0으로 초기화

void realloc(void ptr, size_t size);

  • 이미 할당받은 메모리에 추가로 메모리 할당, 이전 메모리 주소 없어짐

void free(void * ptr);

  • 할당한 메모리를 해제
  • 할당한 메모리를 제대로 해제하지 않으면 메모리 릭(메모리 누수)이 발생한다.
  • 예시
    • free(arr);
    • malloc으로 할당한 메모리 해제
profile
하루에 집중하자

0개의 댓글