본문 바로가기
c언어

c언어 동적 메모리 할당, 사용, 반납 방법 알아보기

by 개발자 L 2023. 2. 27.
반응형

c언어 동적 메모리 할당, 사용, 반납 방법 알아보기

네 안녕하세요, 이번 포스팅에서는 동적 메모리를 할당하는 방법, 사용하는 방법,

그리고 반납하는 방법에 대하여 알아보도록 하겠습니다.

이전 포스팅에서는 동적 메모리의 기본적인 것들만 간단히 알아보았는데,

직접 사용하기 위해서는 사용법을 알아야겠죠?
아주 중요한 부분인 만큼 많이 알아가셨으면 좋겠습니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 동적 메모리 할당하기(malloc())

동적 메모리를 할당하기 위해서는 malloc()이라는 함수를 씁니다.

여기서 인수의 사이즈는 할당을 받고 싶은 바이트 수가 됩니다.

malloc() 함수는 <stdlib.h> 헤더 파일에 함수 원형이 정의가 되어있고,

여기서 쓰이는 size_t는 기본적으로 unsigned int형으로 정의가 되어있습니다.

사용하는 방법은 이렇습니다.

int *p;
p = (int *)malloc(100 * sizeof(int));

이 malloc() 함수는 동적 메모리의 주소를 반환하기 때문에 포인터를 사용하여서 동적 메모리를 사용하면 됩니다.

여기서 보이는 100은 할당을 받을 바이트 수입니다.

그리고 대다수의 자료형으로 받을 수 있지만 정수형 자료형을 가장 많이 쓰기 때문에 정수형으로 표현을 해봤습니다.

또한, 여기서 눈여겨보셔야 할 부분은 '100 * sizeof(int)'인데,

여기서 100은 동적 메모리를 할당받은 총 바이트 수이며, 여기에 할당이 되는 정수 한 개의 크기는 sizeof(int)입니다.

그래서 다시 말하면 100 바이트의 공간 중 정수 sizeof(int) 개가 됩니다.

물론 그냥 정수형으로 '100 * 2' 이런 식으로 써도 되지만,

컴퓨터에 따라 정수의 크기가 다를 수도 있기 때문에

해당 컴퓨터의 할당되는 크기에 맞도록 위의 방법처럼 쓰는 것이 안전합니다.

 

2 - 1. maloc()의 반환형

malloc()의 반환형은 'void *'입니다.

void 포인터를 반환하는 이유는 malloc()의 입장에서 개발자가 어떤 자료형을 사용할지 선언하기 전 까지는 알 수 없어서

기본적으로 void 포인터를 씁니다.

그래서 본인이 원하는 포인터 타입으로 바꾸시면 됩니다.

이런 식으로 말이죠.

int *score;
score = (int *)malloc(100 * sizeof(int)); // int형 포인터로 변환
...
if(score == NULL) // 메모리가 올바르게 할당이 되었는가에 대한 오류 체크
{
...
}

이런 식으로 씁니다.

여기서 저 if문을 쓰는 이유는 malloc()의 경우 메모리가 부족할 때 NULL을 반환하기 때문에

항상 반환값이 NULL이 아닌지도 확인을 해야 합니다.

또한 malloc()의 경우는 메모리 효율을 위해서 따로 초기화를 하지 않기 때문에 쓰레기 값들이 들어가 있습니다.

그래서 개발자는 자신이 원하는 값으로 초기화를 시켜야 합니다.

반응형

 

2. 동적 메모리 사용하기

그럼 이제 동적 메모리를 할당을 받았으니, 사용도 해야겠죠?
앞서 말했듯이, 동적 메모리 할당 함수인 malloc()의 경우는 포인터를 반환하기 때문에

포인터를 이용해서 동적 메모리를 사용해야 합니다.

두 가지 방법을 사용하며 아래와 같습니다.

  • * 연산자 사용하기
  • [] 연산자 사용하기

2 - 1. * 연산자 사용하여 동적 메모리 사용하기

이 방법은 그냥 똑같이 포인터로 취급을 하여 사용하는 방법입니다.

이런 식으로 사용하시면 됩니다.

*score = 100;
*(score + 1) = 200;
*(score + 2) = 300;
...

 

2 - 2. [] 연산자 사용하여 동적 메모리 사용하기

이 방법은 동적 메모리를 배열과 같이 취급하여 사용하는 방법입니다.

보통 동적 메모리를 동적 배열이라 생각하고 다루기 때문에 이 방법이 전자의 방법보다 더 많이 쓰입니다.

사용 방법은 이렇습니다.

score[0] = 100;
score[1] = 200;
score[2] = 300;
...

 

3. 동적 메모리 반납(해제)하기(free())

이번에는 동적 메모리를 반납하는 방법에 대하여 알아보도록 하겠습니다.

시스템 내에서 할당이 가능한 동적 메모리는 크기가 제한이 되어 있으므로,

할당받은 메모리의 사용이 끝나면 항상 다른 프로그램이 메모리를 사용할 수 있도록 반환을 해야 합니다.

이때 사용하는 함수는 free() 함수이고,

역시 할당되어 있는 메모리를 가리키고 있는 포인터를 호출해야 합니다.

그렇기 때문에 malloc()이 호출한 포인터를 절대 잊어서는 안 됩니다.

그리고 free()를 통해 반납이 된 동적 메모리는 더 이상 사용이 불가합니다.

사용 방법은 이렇습니다.

score = (int *)malloc(100 * sizeof(int));
...
free(score); // score가 가리키는 동적 메모리 반납

 

여기까지 동적 메모리의 할당, 사용, 반납 방법에 대하여 알아보았습니다.

다음 포스팅에서는 이들을 이용해서 기본적인 예제들을 작성해 보는 시간을 가져보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글