메모리 동적할당이란?
프로그래밍을 할 때 사용하는 변수들은 모두 메모리에 저장되어 사용됩니다. 이중 전역 변수/정적 변수는 프로그램의 시작과 종료 시점에, 지역 변수/매개 변수는 함수의 호출과 반환 시점에 메모리의 할당 및 반납이 이루어집니다.
하지만 동적할당은 프로그램 동작 중에 (런타임) 메모리를 할당받고 반납할 수 있는 것을 말합니다. 즉, 사용자가 원하는 시점에 만들고 반납할 수 있습니다.
메모리 동적할당 및 해제 방법
메모리의 동적 할당은 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개가 됩니다.
'[R&D] 프로그래밍 > C, C++' 카테고리의 다른 글
[C/C++] 메모리 동적할당 2 (realloc, calloc) (0) | 2022.08.03 |
---|---|
[C/C++] 배열이란? - 배열의 개념 및 기본 사용법 (2) | 2022.07.28 |
[C/C++] 포인터(pointer)란? - 포인터의 기본 개념 (2) | 2022.07.27 |
[C++] 자료형 확인 방법 (type_info name) (0) | 2022.07.19 |
[C/C++] 자료형 크기 및 범위 정리 (0) | 2022.07.13 |
댓글