1. 동적 메모리 할당
동적 메모리 할당은 프로그램 실행 중에 필요한 메모리의 양을 결정하고 할당하는 과정을 말한다.
stdlib.h 헤더 파일에 정의된 함수를 통해 동적 메모리 관리를 할 수 있다.
1.1 주의사항
- 할당된 메모리는 사용 전 반드시 초기화를 해야한다.
- 메모리 사용이 끝나면 반드시 free( ) 함수를 사용하여 해제해야 한다.
2. malloc( ) 함수 (memory allocation)
malloc은 동적 메모리 할당을 위해서 사용되는 함수이다.
2.1 malloc 함수 사용법
2.1.1 size
할당받고자 하는 메모리의 크기를 바이트 단위로 지정
2.1.2 mlloc
할당된 메모리 블록의 첫 번째 바이트를 가리키는 void 포인터 반환
void *malloc(size_t size);
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = NULL;
int n = 5;
// 5개의 정수를 저장할 수 있는 메모리를 동적으로 할당
ptr = (int*)malloc(n * sizeof(int));
// 메모리 할당 검증
if (ptr == NULL) {
printf("Memory allocation failed\\n");
return -1;
}
// 할당된 메모리 사용
for (int i = 0; i < n; i++) {
ptr[i] = i + 1;
}
// 할당된 메모리에서 데이터 읽기
for (int i = 0; i < n; i++) {
printf("%d ", ptr[i]);
}
// 사용 완료 후 메모리 해제
free(ptr);
return 0;
}
3. calloc( ) 함수
malloc과 유사하게 동작하지만 calloc은 할당된 메모리를 자동으로 0으로 초기화 한다.
3.1 calloc( ) 함수 사용법
3.1.1 num
할당받을 요소의 개수
3.1.2 size
각 요소의 크기를 바이트 단위로 나타낸다.
3.1.3 반환 값
할당된 메모리 블럭의 첫 번째 바이트를 가리키는 void 포인터 반환
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
// 10개의 정수를 저장할 수 있는 메모리 공간을 할당하고 0으로 초기화
arr = (int *)calloc(10, sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\\n");
return -1;
}
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]); // 모든 값이 0으로 초기화되어 있음 0 0 0 0 0 0 0 0 0 0
}
// 사용 후 메모리 해제
free(arr);
return 0;
}
4. realloc( ) 함수
이미 할당된 메모리 블록의 크기를 변경할 수 있다.
즉, 기존에 할당된 메모리의 크기를 늘리거나 줄이기 위해 사용된다.
4.1 realloc( ) 사용법
4.1.1 prt
이미 할당된 메모리 블록의 포인터. NULL 값이면 새로운 메모리를 할당하고 malloc 함수처럼 작동
4.1.2 newSize
메모리 블록에 할당하려는 새로운 크기이다.
4.1.3 반환값
할당된 새로운 메모리 블록의 포인터를 반환한다.
void *realloc(void *ptr, size_t newSize);
#include <stdio.h>
#include <stdlib.h>
int main() {
int* arr = malloc(10 * sizeof(int)); // 10개 정수 공간 할당
// 메모리 할당 확인
if (arr == NULL) {
printf("Memory allocation failed\\n");
return -1;
}
// 배열 사용
// 배열 크기 변경을 위해 realloc 사용
arr = realloc(arr, 20 * sizeof(int)); // 크기를 20개의 정수 공간으로 변경
// 메모리 할당 확인
if (arr == NULL) {
printf("Memory reallocation failed\\n");
return -1;
}
// 새로 할당된 배열 사용
free(arr); // 메모리 해제
return 0;
}
5. free( ) 함수
동적으로 할당된 메모리를 해제하는 데 사용된다.
할당된 메모리는 필요하지 않으면 해제 되어야 한다. 메모리를 해제하지 않으면 memory leak가 발생한다.
5.1 free( ) 사용법
5.1.1 ptr
해제할 메모리 블록을 가리키는 포인터이다.
void free(void *ptr);
#include <stdlib.h>
int main() {
int* ptr = malloc(10 * sizeof(int)); // 10개의 int 크기만큼 메모리 할당
if (ptr != NULL) {
// 메모리를 사용하는 코드
free(ptr); // 동적으로 할당된 메모리 해제
ptr = NULL; // 포인터를 NULL로 설정
}
return 0;
}