컴퓨터 프로그래밍에서 실행 중(런타임)에 사용할 메모리 공간을 할당하는 것
malloc 또는 calloc을 호출하게 되면 힙 영역에 필요한 만큼의 메모리 공간을 확보하고 이후 반환 타입으로 메모리 공간의 시작위치를 포인터로 반환한다. 또한 할당된 메모리를 어떤 목적에 사용할지 함수에서 판단하기 어렵기 때문에 return 타입은 void* 형을 return하며 반환 받는 쪽에서 타입 캐스팅을 통해 사용해야 한다.
int *arr=(int *)malloc(10*sizeof(int));
int *arr=(int *)calloc(10,sizeof(int)); // 둘 다 같은 코드
메모리 누수
int *a = malloc(5); // 5byte 메모리 공간 선언
int *b = malloc(10); // 10byte 메모리 공간 선언
b = a; // b가 a의 주소를 가리킴
free(a); // a할당 해제
free(b); // b도 a의 주소를 가리키므로, a할당 해제
// b공간의 동적메모리를 해제할 수 없으므로 메모리 누수
메모리 재할당
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int*)malloc(3 * sizeof(int)); // 정수 3개 크기 할당
// 초기값 설정
arr[0] = 10; arr[1] = 20; arr[2] = 30;
// 크기 변경 (정수 5개로 확장)
arr = (int*)realloc(arr, 5 * sizeof(int));
arr[3] = 40;
arr[4] = 50;
// 결과 출력
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); //10 20 30 40 50 출력
}
free(arr); // 메모리 해제
return 0;
}
- ptr == NULL일 경우
- 재할당을 위한 메모리 공간이 선언되어 있지 않는 것이므로, malloc 또는 calloc을 이용해 새로운 메모리 공간을 할당하는것과 동일한 기능을 수행하게 된다.
- size == 0일 경우
- 현재 ptr 위치의 메모리 블록 크기를 0으로 만든다는 의미이므로, 이는 곳 해당 메모리 공간을 할당 해제 한다는 의미와 같다. 따라서 이는 free 함수를 호출하는 것과 동일한 기능을 수행하게 된다.
- ptr != NULL일 경우
- realloc은 기존 메모리 블록을 확장할 수 있으면 같은 위치에서 크기를 변경한다.
- 하지만 메모리 공간이 부족하면 새로운 위치에 메모리를 할당하고, 기존 데이터를 복사한 후 원래 메모리를 해제합니다.
- 따라서 반환된 새 주소를 기존 포인터에 저장한다.
realloc이 실패하면 NULL을 반환하므로, 기존 포인터를 덮어쓰지 말곡 임시 포인터를 사용하는것이 안전하다.

