C언어의 동적 메모리 구조에 대해서 알아보기 전에 메모리 구조를 먼저 살펴본다.
이번에 알아볼 동적 할당은 "힙 영역"을 통해서 알아볼 것이다.
일단 "힙 영역"이란 사용자가 원하는 시점에 메모리를 할당하고 소멸할 수 있도록 하는 변수가 할당되는 공간으로 지금 할 동적 메모리 할당에 알맞은 공간이다.
메모리 할당에는 두 가지 방식이 있는데,
1. 정적 할당
프로그램 실행 전 변수의 저장공간을 미리 할당할 후 프로그램이 종료될 경우 해제되는 방식
예제) int num = 15;
2. 동적 할당
프로그램 실행 중 필요한 만큼의 메모리를 할당 후 원할 때 해제하는 방식
의 두 가지 방법이 있다.
동적 할당의 장단점
장점 : 상황에 따라 원하는 크기만큼의 메모리가 할당되어 경제적이고, 이미 할당된 메모리도 크기 조절이 가능하다.
단점 : 사용하지 않게 된 경우 명시적으로 메모리를 해제해주어야 한다. 이유는 아래에서 설명하겠다.
그렇다면 동적 할당을 왜 사용하느냐 그 필요성과 이유는 정적 할당에 있다.
정적 할당은 변수의 저장공간을 미리 할당하는 것으로 예로 char arr [10]의 배열의 공간 속에 무언가를 집어넣게 되면 항상 꼭 맞는 내용물이 들어가는 것은 아니다. 선언한 크기보다 작은 거나 큰 내용물이 존재할 수 있는데, 작을 경우에는 메모리가 낭비되고, 클경우에는 오버플로우의 위험이 존재한다. 이를 방지하기 위해 우리는 동적 할당을 사용한다.
동적할당 사용
동적 할당에 사용되는 함수는 총 4가지가 있다.
함수 |
기능 |
void * malloc(size_t size); |
size 바이트의 메모리를 힙에서 할당하여 반환한다. |
void * calloc(size_t num, size_t size); |
(num * size) 바이트의 메모리를 힙에서 할당하고 포인터 값을 반환한다. |
void * realloc(void * ptr, size_t size); |
ptr이 가리키는 메모리를 size바이트만큼 힙에서 재할당하여 반환한다. |
void free(void * ptr); |
ptr이 가리키는 메모리를 해제한다. 해제 전까지 계속 존재하므로 필요 없을 경우 이 함수를 이용해 해제한다. |
malloc의 사용
i라는값에다가 메모리를 할당하는 방식
sizeof(int)는 4와 같으므로 malloc함수에다가 4byte를 할당받고 int형으로 바꾸는 것
만약에 malloc(sizeof(int))를 그대로 두고 (int*)을 short형으로 변경할 경우 i변수의 크기는 short형 배열 2개로 바뀐다.
예시로 자신이 입력하는 크기만큼을 할당하고 싶다면
int * arr = (int*) malloc(sizeof(int)*input);<- input을 입력받을 경우 input만큼의 양을 만들기 위한 선언이다.
realloc의 사용
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
int main() {
int *arr, size, i;
size = 5;
arr = (int*)malloc(size*sizeof(int));
for (i = 0; i < size; i++) {
arr[i] = i;
}
printf("malloc : ");
for (i = 0; i < size; i++) {
printf("%d", arr[i]);
}
printf("\n");
size = 10;
arr = (int*)realloc(arr, size*sizeof(int));
for (i = 5; i < size; i++) {
arr[i] = i;
}
printf("realloc : ");
for (i = 0; i < size; i++) {
printf("%d", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
코드에서 보듯이 malloc으로 할당된 메모리를 증가된 크기만큼 변경시켜 출력을 한다.
출력결과는
realloc으로 변경된 사이즈만큼 데이터가 출력되는것을 알수 있다.
free의 사용
할당된 메모리를 해제하는 함수이다.
위에서 동적할당의 특징을 설명할 때 해제해야한다는 이유이다.
메모리를 할당받고 해제되지않을 경우에는 할당받은 메모리를 사용이 끝나도 컴퓨터가 종료될때까지 유지가 된다.
그 뜻은 메모리 누수가 발생한다는 뜻으로 꼭 해제를 해주어야 한다.
할당 -> int * arr = (int*)malloc(sizeof(int));
해제 -> free(arr);
'C언어' 카테고리의 다른 글
C언어 파일 입출력 (0) | 2019.07.09 |
---|