본문 바로가기

IT 지식/c 프로그래밍 언어

동적할당이란 무엇인가?

728x90
반응형

목표

동적할당에 대해서 알아보자

학습할 것

  • 동적할당이란 무엇인가?
  • 동적할당의 장점
  • 동적할당의 단점
  • 동적할당 정의하는 법
  • 1차원 배열의 할당
  • 2차원 배열의 할당
  • malloc, realloc, calloc의 비교

 

 

1. 동적할당이란 무엇인가?

 

우선, 메모리를 할당하는 영역에는 2가지 종류가 있다.

정적 메모리 할당과 동적 메모리 할당.

정적 메모리는 이름처럼 정적(static)인 즉, 움직이지 않는 공간이다.

우리가 필요한 공간을 미리 알때, 그만큼만의 공간을 고정해서 OS로부터 빌려다쓰고 다시 갖다놓는다.

반면, 동적 메모리는 이름처럼 동적(dynamic)인, 즉 움직이는 공간이다.

우리가 필요한 공간을 정확히 모를때, 충분한 메모리공간을 확보하기 위해 많은 메모리 공간을 빌려다 쓰는 경우에 쓴다. 동적 메모리가 할당받는 영역을 힙영역이라고 한다.

 

2. 동적할당의 장점

동적할당에서는 엄청 큰 데이터의 공간이 필요할 때 그것을 빌려올 수 있다. 

 

동적할당의 단점)

3. 동적할당의 단점

동적할당은 자동으로 메모리를 반환하지 않기 때문에 우리가 수동으로 데이터를 반환해야 한다.

 

4. 동적할당 정의하는 법

함수 원형)
void * malloc(size_t  size);

반환값이 void 포인터, 즉 공간이 정해지지 않은 공간의 첫번째 주소값을 결과값으로 반환한다.

malloc 안의 인자는, 내가 필요한 공간사이즈(size)가 몇 바이트 필요한지(size_t)를 말하는 것이다. 

다음 예를 들어보자.

 

double* ptr = (double*)malloc(30* sizeof(double));

void 주소값을 반환하기에 주소값을 받을 수 있는 변수인 포인터 변수를 설정해주어 거기에다가 받는다.

여기서 필요한 공간 사이즈가 double 이라고 가정하자. 따라서 원래는 void값이기에 double로 자료형을 타입캐스팅 (double *) 해준다. malloc의 인자가 뜻하는 바는 double 사이즈의 공간, 즉 8바이트의 공간을 30개 불러오겠다라는 소리이다.

그리고 다 쓰고 난뒤에는 반드시 수동으로 반환해야 하기 때문에 free(포인터)라는 함수로 다시 돌려줘야한다. 

 

그런데 만약 메모리에 공간이 없어서 OS가 할당을 해주지 않는다면 malloc()함수는 NULL 을 반환한다.

이때는 우리가 알아들을 수 있게 코드를 짜주어야 한다.

if (ptr == NULL) 

printf("there is an error");

}

 

 

5. 1차원 배열의 할당

 

1차원 배열은 말그대로 같은 메모리 공간을 여러개 동적으로 확보하는 방법이다.

위의 예제 

double* ptr = (double*)malloc(30* sizeof(double));

에서 이미 설명한 바와 동일하다.

 

6. malloc, realloc, calloc의 비교

 

  • malloc, realloc, calloc의 비교
  • malloc 은 기본 주소 1개를 할당
  • calloc 은 기본주소 여러개 할당(배열)
  • realloc은 앞 인자 메모리를 뒤 인자크기로 변경한 후 기본주소 할당

calloc 은 초기화를 0으로 해준다. 

malloc 은 초기화 안해줘서 쓰레기값이 나온다.

할당받은 뒤에 거기서 더 추가로 할당받을 때 혹은 덜 할당받고 싶을 때 다시 할당받는 realloc 함수가 있다.

realloc 은 초기화를 해주지 않는다.

 

 

더 알아볼 질문들)

void 반환형은 메모리에서 몇 바이트 공간을 차지할까?\

2차원 배열

728x90
반응형

'IT 지식 > c 프로그래밍 언어' 카테고리의 다른 글

구조체란 무엇인가  (0) 2021.10.08
형변환, 포인터, 함수에 대해 알아보자  (1) 2021.10.03
C 언어란 무엇인가  (1) 2021.10.03