본문 바로가기
[R&D] 프로그래밍/C, C++

[C/C++] 메모리 동적할당 및 해제 (malloc, free) 사용법

by Geuni 2022. 8. 1. 18:30
728x90
반응형

메모리 동적할당이란?

 프로그래밍을 할 때 사용하는 변수들은 모두 메모리에 저장되어 사용됩니다. 이중 전역 변수/정적 변수프로그램의 시작과 종료 시점에, 지역 변수/매개 변수 함수의 호출과 반환 시점에 메모리의 할당 및 반납이 이루어집니다.

하지만 동적할당은 프로그램 동작 중에 (런타임) 메모리를 할당받고 반납할 수 있는 것을 말합니다. 즉, 사용자가 원하는 시점에 만들고 반납할 수 있습니다.

 

메모리 동적할당 및 해제 방법

메모리의 동적 할당은 malloc() 함수를 통해, 메모리 반납은 free()를 통해 사용 가능합니다.

<stdlib.h>를 통해 사용 가능하며 함수 원형은 아래와 같습니다.

#include <stdlib.h>

void *malloc (size_t size);

void free (void *ptr);
[malloc]
size : 할당받을 메모리의 크기를 말합니다. Byte 단위로 입력합니다.

[free]
*ptr : malloc를 통해 할당받은 메모리의 주소입니다.

 

예제)

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

int main(void)
{
    int *pInt;
    char *pChar;
    float *pFloat;

    int count = 5;

    pInt = (int *)malloc(sizeof(int) * count);
    pChar = (char *)malloc(sizeof(char) * count);
    pFloat = (float *)malloc(sizeof(float) * count);

    printf("malloc address : 0x%p / 0x%p / 0x%p\n", pInt, pChar, pFloat);

    /* write */
    pInt[0] = 51;
    *pChar = 42;
    *(pFloat + 2) = 3.14;

    /* read */
    printf("value : %d / %d / %.2f\n", *pInt, pChar[0], pFloat[2]);

    free(pInt);
    free(pChar);
    free(pFloat);
}
malloc address : 0x00AC2840 / 0x00AC2860 / 0x00AC2870
value : 51 / 42 / 3.14

할당을 받은 메모리에 값을 읽고 쓸 때에는 1. 배열 인덱싱(val[index]), 2. 주소값 역참조(*addr)의 두가지 방식으로 할 수 있습니다. 위 예제처럼 사용하면 됩니다.

 

한 가지 유의해야 할 점은 위 예제와 같이 동적할당할 때는 내가 할당받을 자료형의 크기 "sizeof(int)"와 몇 개를 사용할지 "count"를 곱해야 합니다. 이는 동적할당 값을 사용할 때에도 자료형의 크기만큼 주소값을 움직이며 제어하기 때문에 그렇습니다.

만약 int 형 (4byte)의 자료형에  1byte 단위로 size를 넣는다면  내가 생각하는 것과 다른 크기의 메모리가 할당받아지기 때문에 프로그램이 오동작하게 됩니다.

printf("int address  : 0x%p / 0x%p / 0x%p\n", &pInt[0], &pInt[1], &pInt[2]);
printf("char address : 0x%p / 0x%p / 0x%p\n", &pChar[0], &pChar[1], &pChar[2]);
int address  : 0x00AC2840 / 0x00AC2844 / 0x00AC2848
char address : 0x00AC2860 / 0x00AC2861 / 0x00AC2862

이처럼 주소값을 보면 int 형은 인덱싱할 때 자료형의 크기인 4byte 단위로 움직이기 때문에 size 입력시 4개를 사용할 생각으로 "4"를 입력하여 할당받는다면 실제로 사용 가능한 메모리는 int형 1개가 됩니다.

728x90
반응형

댓글