본문 바로가기
C and C++

[C Language] 동적 메모리 할당(Dynamic Memory Allocation): Realloc Function

by Henry Cho 2022. 5. 31.
728x90

동적 메모리 할당(Dynamic Memory Allocation): Realloc Function


포스트 난이도: HOO_Middle

 

[Notice] 포스트 난이도에 대한 설명

안녕하세요, HOOAI의 Henry입니다. Bro들의 질문에 대한 내용을 우선적으로 포스팅이 되다 보니 각각의 포스트에 대한 난이도가 달라서 난이도에 대한 부분을 작성하면 좋겠다는 의견을 들었습니다

whoishoo.tistory.com


# 동적 메모리 할당

C언어에서 동적 메모리를 할당하기 위해 사용되는 함수들이 있다.

이번 포스트에서는 저번 포스트 Malloc 함수에 이어서 Realloc 함수에 대해서 살펴보도록 하자.

https://whoishoo.tistory.com/340

 

[C Language] 동적 메모리 할당: Malloc Function

동적 메모리 할당: Malloc Funciton 포스트 난이도: HOO_Middle [Notice] 포스트 난이도에 대한 설명 안녕하세요, HOOAI의 Henry입니다. Bro들의 질문에 대한 내용을 우선적으로 포스팅이 되다 보니 각각의 포

whoishoo.tistory.com

 


# remalloc

Realloc function은 메모리에 할당된 메모리 블록의 사이즈를 조정하는 역할을 수행한다.

메모리 블럭 사이즈를 조정하기 위해서는 앞서서 메모리 블록의 특정 데이터가 할당되어 있어야 하는데, 이때 사용되는 함수가 바로 malloc 또는 calloc 함수이다.

malloc 또는 calloc 함수를 통해 메모리 블럭이 할당되었을 때 메모리 블록 사이즈의 조정이 필요한 경우 사용되는 기능이 realloc인 셈이다.

이것이 정적 메모리와 동적 메모리의 차이점이라고 볼 수 있다.


# remalloc 기본 작성법

realloc 기본 작성법은 아래와 같다.

void *realloc(void *ptr, size_t size)

처음 메모리 블럭을 할당하는 malloc과 달리 realloc에서는 포인터에 대한 부분을 나타내 줘야 한다.

따라서 realloc에서는 *ptr라고 하는 포인터 부분을 선언해줘야 한다.

ptr을 통해서 특정 메모리 블럭에 대한 위치를 알 수 있고 이를 기반으로 메모리 블록이 새롭게 할당(reallocated) 된다.

만약에 기존 메모리 블럭이 NULL값이라면 메모리 블록이 해당 포인터에 새롭게 할당된다.

size의 경우에는 malloc에서와 같이 얼마만큼의 메모리 블록 사이즈를 할당할지를 지정한다.

결국 malloc 함수와 realloc 함수는 포인터에 해당하는 ptr을 작성하는지만 다를 뿐 기본 작성 방식은 비슷하다.


# realloc() Example Codes

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
   char *msg;
   
   msg = (char *) malloc(10);
   strcpy(msg, "Hi, I'm HOO.");
   printf("String = %s \nAddress = %u\n", msg, msg);

   msg = (char *) realloc(msg, 20);
   strcat(msg, " Nice to meet you.");
   printf("String = %s  \nAddress = %u\n", msg, msg);

   free(msg);
   
   return(0);
}
String = Hi, I'm HOO. 
Address = 2839958176
String = Hi, I'm HOO. Nice to meet you.  
Address = 2839958176

위의 예제를 살펴보면, malloc 함수를 통해서 "Hi, I'm Hoo."라는 메세지를 메모리 블록에 할당하여 저장하였다.

이후에 realloc 함수를 사용해서 같은 address에 메세지를 추가하였다.

따라서 주소값은 기존 msg와 바뀐 msg가 동일하다.

다만 realloc 함수를 사용하여 추가되는 메시지의 길이가 기존의 메시지 사이즈보다 크기 때문에 메모리 블록 사이즈도 변경해줘야 한다.


 

728x90

댓글