C 언어 - 동적 메모리 할당 - malloc 함수

컴퓨터/C

728x90
반응형

 malloc 함수

malloc 함수는 Memory allocation의 줄임말입니다. 

malloc 함수를 이용해서 동적 메모리 할당을 하게 되면 힙 역영에 메모리를 할당받게 됩니다. 

동적 메모리 할당을 하게 되면 정적 메모리 할당을 최소화하여 프로그램의 몸집을 간소화할 수 있고, 프로그램의 크기를 좀 더 자유롭게 제어할 수 있게 됩니다. 

본문에서는 malloc 함수를 이용하여 동적할당 해보고 , 사용이 끝난 동적 할당된 메모리를 free함수를 이용해서 제거해보도록 하겠습니다.

 

 

malloc 함수의 원형

 malloc 함수는 stdlib.h에 들어있고 원형은 아래와 같습니다.

<stdlib.h>
void *malloc(unsigned int);
  • malloc 함수는 void 포인터형 함수이며 매개변수로는 양의 정수가 들어간다.
  • 즉 반환값은 void 포인터형 (모든 포인터)이며 매개변수는 할당할 메모리의 크기이다.
    • 어떤 포인터 = malloc(할당할 바이트수);
  • 동적 메모리 할당에 성공하면 메모리 주소값을 반환한다.
  • 실패한다면 NULL값이 반환된다. 

free 함수의 원형

malloc 함수의 짝꿍 같은 존재로 C언어에서는 반듯이 동적 할당된 메모리 사용이 끝나면 free함수로 할당을 해제해야 된다.

<stdlib.h>
void free(void* ptr);
  • free함수의 반환값은 없으며, 매개변수는 void 포인터이다.
    • 즉 동적할당한 포인터 값을 매개변수로 넣어주면 해제가 가능하다.

 

동적할당 사용해보기

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


int main()
{
    int* num; // 포인터 변수생성 (스택영역) 
    num = malloc(sizeof(int)); // 스택영역에 생성된 포인터 변수에 동적메모리를 할당
    if (num == NULL)
    {
        printf("동적 메모리 할당에 실패했습니다.\n");
    }
    else
    {
        printf("%p\n", num); //할당된 동적 메모리 주소 확인
        *num = 10; ////동적 메모리 주소 안에 값 입력
        printf("%d", *num); //동적 메모리 주소 안의 값 출력    
    }
    free(num); //사용이 끝난 동적 메모리 할당 해제
    return 0;
}

위의 소스코드와 결과를 보면 포인터 변수에 다른 변수의 주소 값이 아닌 동적 메모리 할당을 통해 힙 영역의 메모리 주소를 넣어온 것입니다. 컴퓨터 상에서 보면 다음과 같습니다.

  • int형 크기만큼 동적메모리 할당을 해서 그 힙 영역의 메모리 주소를 포인터 변수 num에 넣었습니다. 
  • 그리고 int를 제어하는 포인터 변수 num에서 저장된 메모리 주소 안의 데이터를 제어할 수 있게 됩니다.

동적 할당 응용해보기 - 배열의 유동성

위의 내용을 다시 한번 정리해보면 아래와 같습니다.

  • malloc함수는 원하는 크기만큼 힙 영역에 동적인 메모리 할당을 하게 해주는 함수입니다.
  • 동적 메모리의 사용이 완료되면 free함수를 통해 할당된 메모리를 해제해 주어야 합니다.
  • 포인터 변수에 동적 메모리의 주소를 넣어 제어할 수 있습니다. 

위의 정리한 동적메모리와 이전에 공부한 포인터 주소 연산의 개념을 적용하면 프로그램 안에서 배열의 크기를 정할 수 있게 됩니다.

 

기존 배열 소스코드

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


int main()
{
    int size;
    printf("원하는 배열의 크기를 정하세요 : ");
    scanf("%d", &size);

    int arr[size] = { 0, }; // error 발생 정적할당은 프로그램이 만들어질때 정해지기 때문에 불가능.
    int arr[10] = { 0, }; // 이런식으로 초기에 값이 확정되어 있어야 한다.
    return 0;
}

 

동적메모리 할당 응용을 한 자유로운 크기의 배열

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


int main()
{
    int size;
    printf("원하는 배열의 크기를 정하세요 : ");
    scanf("%d", &size);

    int* parr = malloc(sizeof(int) * size); // 동적 메모리 할당 입력받은 사이즈 * int 크기만큼 
                                            // 이 할당받은 메모리 시작 주소를 포인터에 대입
    if (parr == NULL)
    {
        printf("동적 메모리 할당 실패 !\n");
    }
    else
    {
        for (int i = 0; i < size; i++)
        {
            *(parr + i) = i;  // int크기만큼 주소연산을 하며 동적메모리에 int크기만큼에 값 넣기
        }
        for (int i = 0; i < size; i++)
        {
            printf("%d\n", *(parr + i));  // 동적 메모리에 저장된 값 출력
        }
    }
    free(parr); // 사용 완료한 동적메모리 할당 해제
    return 0;
}

위의 소스코드처럼 동적 메모리 할당을 사용한다면 프로그램이 진행 중에도 메모리의 할당이 가능해지기 때문에 다양한 조금 더 유연한 프로그램을 만들 수 있게 됩니다.

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - void 키워드  (0) 2021.07.10
C 언어 - 문자열을 숫자로 atoi / atol / atoll / atof  (0) 2021.07.08
C 언어 - 동적메모리의 개념  (0) 2021.07.02
C 언어 - 쓰래기값과 초기화  (0) 2021.06.30
C 언어 - 열거체(enum)  (0) 2021.06.30

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :