반응형

동적할당이란?

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