동적할당이란?


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







동적할당의 장점과 단점


-장점 상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.


-단점 : 더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다.

+ Recent posts