동적할당이란?
우선 c언어에서는 메모리 할당 방식의 종류가 2가지로 나뉘는데 한 가지는 정적인 방식과 동적인 방식으로 나뉜다.
ㆍ정적인 방식 : 프로그램 실행 전 변수의 저장공간을 먼저 할당 후 프로그램 종료 시 해제.
Ex) int a[10] = 0;
ㆍ동적인 방식 : 프로그램 실행 중 필요한 만큼의 메모리를 할당 후 원할 때 해제.
▶동적 할당은 언제, 왜 필요할까?
동적할당은 상당이 많은 상황에서 꼭 필요합니다. 예를 들어 영어 이름을 저장하는 char배열을 만든다고 가정할 때 char 배열의 크기를 얼마나 크게 잡아야 할까? 대충 15글자로 정했다고 하면 아래와 같이 배열을 만들 것이다.
char name[15];
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □
그렇다면 만약에 name에다가 Hong Gil dong이라는 이름을 넣으면 name
이라는 배열에 총 13글자가 들어간다.
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □
하지만 이 배열의 크기는 15인데 13 만들어가면 2라는 크기의 메모리가 낭비된다.
그리고 만약에 Hong Myeong seong이라는 이름을 넣으면 이 배열에
17글자가 들어간다. 즉 15라는 배열의 크기를 초과했다.
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
이처럼 오버플로우 위험 또한 생긴다.
그래서 이럴 때 사용하는 것이 동적 할당이다.
▶동적 할당의 사용방법
malloc 함수로 동적 할당함. (C 언어의 표준 라이브러리로 stdlib.h에 정의)
▶malloc함수
예를 들어 malloc(4)를 하면 4byte만큼의 메모리를 할당받는다.
사용의 예를 들어보자면 다음과 같다.
Ex) int *i = (int*) malloc (sizeof(int));
위와 같이 i라는 포인터 변수를 선언하고 i값에다가 메모리를 할당하는 것이다.
sizeof(int)는 4와 같으니 malloc함수에 4byte의 메모리를 할당받고 int 형으로 바꾸어 주는 것이다.
만약에 malloc(sizeof(int))는 그대로 하고 앞에 int*을 int형이 아니라 short형으로 바꾼다면 i라는 변수는 short형의 크기의 배열 2개가 선언됩니다.
예를 들어 input을 받아 input 만큼 배열의 크기를 할당받고 싶다면
int *arr = (int*) malloc(sizeof(int)*input);
이런 식으로 하면 된다.
▶free함수
할당된 메모리를 해제하는 함수이다.
메모리를 할당받고 메모리가 해제되지 않으면 할당받은 메모리는 사용이 끝났음에도 불구하고 컴퓨터가 종료되기 전까지 해당 메모리를 차지하게 된다.
따라서 메모리를 할당만 하고 해제를 안 하면 언젠가는 메모리가 부족해지는 현상이 발생하게 된다. 때문에 동적 할당 후 더 사용할 이상 필요가 없다면 꼭 free함수로 메모리를 해제시켜주어야 한다.
다음 같이 메모리를 할당을 해주었으면
int *arr = (int*) malloc(sizeof(int)*input);
마지막에는 꼭 다음과 같이 메모리를 꼭 해제시켜 주어야 한다.
free(arr_2);
동적 할당의 장점과 단점
-장점 : 상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.
-단점 : 더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다.
'IT > 프로그래밍 공부' 카테고리의 다른 글
2022 국내&해외 프로그래밍 언어 순위, 사이트 (0) | 2022.01.09 |
---|---|
C 자료구조 메모리 공간, 스택(Stack), 힙(Heap), 데이터(Data) (0) | 2021.11.28 |
[C언어] 배열 기초 예제, 연습 문제 1탄 (0) | 2021.11.26 |
[C언어] for문 기초 예제, 연습문제 2탄 (0) | 2021.11.25 |
[C언어] for문 실전 예제, 소수 출력 프로그램 (0) | 2021.11.24 |