본문으로 바로가기

C언어 동적 메모리 할당

category C언어 2019. 7. 9. 19:46
728x90

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);

 

728x90

'C언어' 카테고리의 다른 글

C언어 파일 입출력  (0) 2019.07.09