C언어 동적 메모리 할당(Dynamic Memory Allocation)
동적 할당 원리, 정적 할당과의 비교
동적 할당을 다루기 전에 먼저 기본적인 정적 할당 방법을 살펴보겠습니다.
#include <stdio.h>
int main(){
// 배열 선언(정적 배열 선언)
int arr[5];
// 값 할당 예시
arr[0] = 1;
arr[1] = 3;
arr[2] = 5;
}
위와 같이 처음에 5칸으로 배열의 크기를 지정하여 선언하는 방식입니다.
이 경우에는 컴파일 단계에서 자동으로 메모리를 할당해 주는데요.
스택 영역에 메모리 공간을 배정받게 되어 고정된 칸 수만 가질 수 있습니다.
(쉽게 생각하면 스택 중간에서 갑자기 차지하는 공간을 늘리거나 줄이는 것이 쉬운 작업은
아니라는 것을 직감하실 수 있을 것입니다.)
이렇게 배열 내 메모리를 할당받을 경우 장단점은 다음과 같습니다.
장점 : 사용하지 않는 메모리 해제를 자동으로 해주어 누수 걱정이 거의 없다.
단점 : 필요한 메모리 양을 잘못 계산하여 너무 크게 할당받으면 메모리 낭비가 생기고
너무 작게 할당받은 경우에도 칸 수를 늘리는 것이 불가능하다.
이 때, 원하는 칸 수를 사용자가 직접 지정하여 할당받고,
중간에 칸 수를 자유자재로 변경할 수 있는 방법이 동적 할당입니다.
여기서는 운영 체제가 직접 관리하는 힙 영역 내에 별도의 공간을 할당받고
사용이 종료되면 사용자가 직접 메모리 해제를 해주어야 누수가 발생하지 않습니다.
(참고 : 스택 영역과 힙 영역에 대한 상세한 차이는 아래의 사이트들을 참고해보세요.)
여기서는 동적 할당의 대표 함수들인 malloc, calloc, realloc의 사용 방법을
정리해보도록 하겠습니다.
malloc 함수
malloc 함수에서는 input으로 할당받을 메모리의 총 크기(바이트)를 받습니다.
int형 5칸 배열을 malloc 동적 할당으로 생성하는 예시 코드는 아래와 같습니다.
#include <stdio.h>
#include <stdlib.h> // stdlib.h 헤더 파일 필요
int main() {
// int형 5칸 동적 할당(malloc)
int *arr=(int*)malloc(sizeof(int)*5);
for (int i = 0; i < 5; i++)
printf("%d\n", arr[i]);
free(arr); // 사용 종료 시 free 필수!
}
여기서 유의할 점은
1. stdlib.h 파일 포함이 필요한 점
2. arr는 포인터 자료형이라는 점(동적 할당된 힙 영역의 주소를 저장합니다.)
3. 사용 종료 후에 arr 변수에 대하여 free 함수로 해제를 해주어야 누수가 방지되는 점
등을 고려해주셔야 합니다.
calloc 함수
calloc 함수는 malloc 함수와 사용법의 거의 유사한데요.
다만, input으로 칸 수, 각 칸의 크기를 따로 받는다는 점과
(ex. int형 5칸인 경우 -> malloc(20) vs calloc(5, 4))
calloc은 초기값이 0으로 고정된다는 점 정도가 두 함수의 차이점입니다.
int형 5칸 배열을 calloc 동적 할당으로 생성하는 예시 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h> // stdlib.h 헤더 파일 필요
int main() {
// int형 5칸 동적 할당(calloc)
int *arr=(int*)calloc(5, sizeof(int));
for (int i = 0; i < 5; i++)
printf("%d\n", arr[i]); // 0 출력
free(arr); // 사용 종료 시 free 필수!
}
마찬가지로 사용 해제 시에는 free를 반드시 선언해주어야 합니다.
realloc 함수
자세히 보면 malloc과 calloc이 분명히 '동적' 할당이라고 했었지만,
얼핏 보면 실제로 사용되는 칸 수는 고정인 것처럼 보입니다.
그러나, 동적 할당의 경우 realloc 함수를 통하여 할당된 메모리의 크기를 변경할 수 있습니다.
사용 방법은 realloc(동적 할당 변수, 변경된 할당 메모리의 총 크기) 형태입니다.
메모리의 총 크기는 malloc 때의 input과 유사하게 작성해주시면 됩니다.
다음은 int형 5칸 동적 할당된 배열을 7칸으로 변경하는 코드의 예시입니다.
#include <stdio.h>
#include <stdlib.h> // stdlib.h 헤더 파일 필요
int main() {
// 정수형 5칸 동적 할당(calloc)
int *arr=(int*)calloc(5, sizeof(int));
for (int i = 0; i < 5; i++)
printf("%d\n", arr[i]);
// 7칸으로 재할당 시도
arr = (int*)realloc(arr, sizeof(int)*7);
for (int i = 0; i < 7; i++)
printf("%d\n", arr[i]);
free(arr); // 사용 종료 시 free 필수!
}
이 경우도 사용 종료 시에는 free를 반드시 선언해주어야 메모리 누수를 막을 수 있습니다.
'C & C++' 카테고리의 다른 글
[C언어] 문자열 내 특정 문자(열) 등장 횟수 탐색 방법 (0) | 2022.09.29 |
---|---|
[C언어] 배열, 문자열 슬라이싱 구현 예제 (1) | 2022.09.23 |
[C언어] 배열 내 특정 값 포함 여부 / 원소 위치 인덱스 찾기 구현 (0) | 2022.08.14 |