동적 메모리 할당: Malloc Funciton
포스트 난이도: HOO_Middle
# 동적 메모리 할당
정적 메모리와 달리 동적 메모리는 Heap 방식으로 개발자가 임의로 지정한 크기만큼 실행 과정에서 메모리 할당이 이루어지는 걸 의미한다.
정적 메모리는 컴파일이나 실행 이후에 정해진 메모리 공간을 나타내지만 동적 메모리는 컴파일 또는 실행 이후에도 메모리 용량의 변화가 이루어질 수 있다는 걸 의미한다.
C언어에서는 동적 메모리를 할당하는 다양한 Functions들이 존재하며 이번 포스트에서는 Malloc 함수에 대해서 살펴보도록 하자.
# Malloc Fucntion
메모리를 다루는 Functions들 중에서 메모리를 할당하는 메커니즘의 기능을 담당하는 것이 Malloc function이다.
C++에서는 new/delete function으로 동적 메모리 할당이 이 루어지만 C에서는 malloc과 remalloc 등을 사용한다.
(당연히 C++에서 사용하는 방식이 간단하다.)
Malloc function을 통해 특정 address에 데이터를 저장할 수 있다는 것이다.
# Malloc Library
#include <stdlib.h>
#include <malloc.h>
Malloc function을 사용하기 위해서는 malloc.h 또는 stdlib.h 라이브러리를 사용해야 한다.
stdlib.h를 사용하더라도 malloc과 같은 동적 메모리 할당 기능들을 사용할 수 있는 이유는 stdlib.h에 동적 메모리 할당에 필요한 기능들의 라이브러리가 같이 포함되어 있기 때문이다.
한마디로 굳이 malloc.h을 사용하지 않아도 stdlib.h로 malloc function을 사용할 수 있다.
# Malloc 기본 작성 방법
Malloc을 사용하는 기본적인 방식은 아래와 같다.
void* malloc(size_t size)
size_t는 동적 메모리 크기를 얼마나 할당할 지에 대해서 나타낸다.
따라서 할당되는 동적 메모리 크기를 지정하는 것이 바로 size_t에 해당한다.
동적 메모리 할당이 실패 시에는 기본적으로 NULL로 return 되는 특징을 가지고 있다.
# 동적 메모리 할당 해제: free()
동적 메모리는 stack이 아닌 heap 방식으로 저장되기 때문에 꼭 마지막에 해제를 시켜줘야 한다.
free() function을 통해서 동적 메모리 할당을 해제시켜줄 수 있다.
물론 동적 메모리 할당을 해제시켜주지 않아도 프로그래밍 컴파일 과정에서 에러가 발생하지는 않는다.
다만 메모리가 사용되지 않아도 계속 증가되는 문제가 발생한다.
코드를 컴파일하는 과정 자체에는 문제가 없지만 메모리가 계속 증가하고 사용되는 실질적인 문제가 발생한다는 것이다.
따라서 마지막에는 free 함수를 통해서 해제하는 과정을 잊지 말아야 한다.
# Malloc Example 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char *str;
str = (char *) malloc(sizeof(char)*10);
strcpy(str, "Hi, I'm HOO.");
printf("Message = %s\nAddress = %u\n", str, str);
free(str);
return(0);
}
위의 Malloc example 1을 살펴보면, malloc function을 통해 string type의 메시지를 address에 저장하고 특정 메모리 주소에 할당을 어떻게 하는지 알 수 있다.
char type의 데이터를 받아 메모리에 저장 후에 free 함수를 사용하여 동적 메모리 할당을 해제한다.
'C and C++' 카테고리의 다른 글
[C Examples] 킬로미터(Km)를 마일(Miles)로 변환하기: scaf(), %.f (0) | 2023.01.31 |
---|---|
[C Language] 동적 메모리 할당(Dynamic Memory Allocation): Realloc Function (0) | 2022.05.31 |
[C++] 반복문: For Loop(For문) (0) | 2022.04.16 |
stack functions(stack.empty(), stack.size()) (0) | 2020.05.03 |
stack functions(stack.push(), stack.top(), stack.pop()) (0) | 2020.05.03 |
댓글